Disons que j'ai le pandas DataFrame ci-dessous:
A B C D 1 foo one 0 0 3 foo two 4 8 5 bar three 7 14 6 bar four 7 14
Je voudrais sélectionner toutes les lignes qui ont des valeurs égales dans A mais des valeurs différentes dans B. Je voudrais donc la sortie de mon code pour être:
A B C D 1 foo one 0 0 2 foo one 2 4 3 foo two 4 8 4 cat one 8 4 5 bar four 6 12 6 bar three 7 14 7 bar four 7 14
Quelle est la manière la plus efficace de faire cela? J'ai environ 11 000 lignes avec beaucoup de variation dans les valeurs de colonne, mais cette situation se présente souvent. Dans mon ensemble de données, si les éléments de la colonne A sont égaux, la valeur de la colonne B correspondante doit également être égale, mais en raison d'un mauvais étiquetage, ce n'est pas le cas et je voudrais résoudre ce problème, il ne serait pas pratique pour moi de faire celui-ci en une.
3 Réponses :
Utilisez groupby + filtre + head :
A B C D 0 foo one 0 0 2 foo two 4 8 4 bar four 6 12 5 bar three 7 14
Quand j'essaye ceci, j'obtiens: type unhashable: 'dict'
. Pour référence type (df)
renvoie:
et type (df.A)
renvoie < code>
Quels sont les types de df.A?
@ apolanco115 Eh bien, je ne sais pas ce qui peut être à l'origine de l'erreur, je charge l'exemple dans votre message en tant que csv et cela fonctionne. Le dtype est également objet. Il semble qu'une de vos colonnes contient un dictionnaire?
Vous pouvez essayer groupby ()
+ filter
+ drop_duplicates()
:
>>> df.drop_duplicates(subset=['A', 'B'], keep="first") A B C D 0 foo one 0 0 2 foo two 4 8 3 cat one 8 4 4 bar four 6 12 5 bar three 7 14
OU, si vous souhaitez supprimer les doublons entre le sous-ensemble de colonnes A
et B
, vous pouvez utiliser ci-dessous, mais la ligne aura également cat
.
>>> df.groupby('A').filter(lambda g: len(g) > 1).drop_duplicates(subset=['A', 'B'], keep="first") A B C D 0 foo one 0 0 2 foo two 4 8 4 bar four 6 12 5 bar three 7 14
Les réponses actuelles sont correctes et peuvent également être plus sophistiquées. Si vous avez des critères complexes, filtre sera très utile. Si vous êtes comme moi et que vous voulez garder les choses simples, je pense que suivre est une manière plus conviviale pour les débutants >>> df = pd.DataFrame({
'A': ['foo', 'foo', 'foo', 'cat', 'bar', 'bar', 'bar'],
'B': ['one', 'one', 'two', 'one', 'four', 'three', 'four'],
'C': [0,2,4,8,6,7,7],
'D': [0,4,8,4,12,14,14]
}, index=[1,2,3,4,5,6,7])
>>> df = df.drop_duplicates(['A', 'B'], keep='last')
A B C D
2 foo one 2 4
3 foo two 4 8
4 cat one 8 4
6 bar three 7 14
7 bar four 7 14
>>> df = df[df.duplicated(['A'], keep=False)]
A B C D
2 foo one 2 4
3 foo two 4 8
6 bar three 7 14
7 bar four 7 14
keep = 'last'
est facultatif ici
Pourquoi le chat 1 manque-t-il?
cat one est manquant car il n'y a pas d'autre ligne telle que «cat» est sa valeur A mais «one» n'est pas sa valeur B. peut-être que mon message n'était pas assez clair, désolé.