web-dev-qa-db-fra.com

Comment "sélectionner distinct" sur plusieurs colonnes de trames de données dans des pandas?

Je cherche un moyen de faire l'équivalent du SQL 

"SELECT DISTINCT col1, col2 FROM dataframe_table"

La comparaison des pandas sql n’a rien de "distinct"

.unique () ne fonctionne que pour une seule colonne, donc je suppose que je pourrais concaténer les colonnes, ou les mettre dans une liste/Tuple et les comparer, mais cela semble être quelque chose que les pandas devraient faire de manière plus native. 

Est-ce que je manque quelque chose d'évident, ou n'y a-t-il pas moyen de le faire?

49
Jody

Vous pouvez utiliser la méthode drop_duplicates pour obtenir les lignes uniques dans un DataFrame:

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

Vous pouvez également fournir le mot clé subset si vous souhaitez uniquement utiliser certaines colonnes pour déterminer l'unicité. Voir le docstring .

96
joris

Il n'y a pas de méthode unique pour un df, si le nombre de valeurs uniques pour chaque colonne était identique, les mesures suivantes fonctionneraient: df.apply(pd.Series.unique), sinon, vous obtiendrez une erreur. Une autre approche serait de stocker les valeurs dans un dict qui est saisi sur le nom de la colonne:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}
6
EdChum

Pour résoudre un problème similaire, j'utilise groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

Cela dépendra cependant de ce que vous voulez faire du résultat (dans mon cas, je voulais simplement l'équivalent de COUNT DISTINCT comme indiqué).

1
ncoghlan

Vous pouvez prendre les ensembles de colonnes et soustraire simplement le plus petit ensemble du plus grand ensemble:

distinct_values = set(df['a'])-set(df['b'])
0
dorante

J'ai essayé différentes solutions. La première était:

a_df=np.unique(df[['col1','col2']], axis=0)

et cela fonctionne bien pour les données qui ne sont pas des objets Une autre façon de le faire et d’éviter les erreurs (pour le type de colonnes d’objet) consiste à appliquer 

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

Vous pouvez également utiliser SQL pour cela, mais cela a fonctionné très lentement dans mon cas:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)
0
Yury

Je pense que l’utilisation de drop duplicate n’est parfois pas très utile en fonction du dataframe.

J'ai trouvé ça:

[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)

Et travaille pour moi!

https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe

0
Naiara Andrade