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?
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 .
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)}
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é).
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'])
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)
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