4 votes

Trouver une ligne dans un cadre de données en fonction de la valeur d'une colonne d'un autre cadre de données et lui appliquer un filtre.

J'ai deux cadres de données df1 et df2.

df1 = pd.DataFrame({'type_id' : [1,2,3,4,3], 'count' : [12,11,15,16,2], 'unique_id' : ['1|12','2|11','3|15','4|16','3|2']})

df2 = pd.DataFrame({'type_id' : [1,3,76,12,11,1], 'count' : [8,6,15,16,5,17], 'col3' : [1,5,7,3,4,7], 'unique_id' : ['1|8','3|6','76|12','12|16','11|5','1|17']})

df1

    type_id     count   unique_id
0   1   12  1|12
1   2   11  2|11
2   3   15  3|15
3   4   16  4|16
4   3   2   3|2

df2

type_id     count   col3    unique_id
0   1   8   1   1|8
1   3   6   5   3|6
2   76  15  7   76|12
3   12  16  3   12|16
4   11  5   4   11|5
5   1   17  7   1|17

Ici, unique_id est une combinaison de type_id et count.

Maintenant, je veux récupérer les lignes de df2 où df2['type_id'] == df1['id'] & df2['count']<df1['count']

c'est-à-dire que je veux des lignes où les deux ids correspondent et où le compte correspondant dans df2 est inférieur au compte de df1

Sortie attendue :

    type_id     count   col3    unique_id
0   1   8   1   1|8
1   3   6   5   3|6

Lorsque j'essaie de faire cela directement, j'obtiens une erreur :

Can only compare identically-labeled Series objects

Comment effectuer cette opération ? Merci d'avance.

3voto

jezrael Points 290608

Utilice Series.map pour le match de id colonnes pour obtenir Series avec la même longueur que df2 Il est donc possible de comparer avec df2['count'] et filtrer par boolean indexing :

df = df2[df2['count'] < df2['type_id'].map(df1.set_index('type_id')['count'])]
print (df)
   type_id  count  col3 unique_id
0        1      8     1       1|8
1        3      6     5       3|6

Détail :

print (df2['type_id'].map(df1.set_index('type_id')['count']))
0    12.0
1    15.0
2     NaN
3     NaN
4     NaN
5    12.0
Name: type_id, dtype: float64

EDIT : Parce que les doublons dans df1['type_id'] est possible de créer des unique_id par chaîne contre colonne par GroupBy.cumcount :

df1 = pd.DataFrame({'type_id' : [1,1,1,4], 'count' : [12,11,15,16]})
df2 = pd.DataFrame({'type_id' : [1,3,76,12,11,1], 
                    'count' : [8,6,15,16,5,17], 'col3' : [1,5,7,3,4,7]})

df1['unique_id1'] = (df1['type_id'].astype(str) + '|' + 
                     df1.groupby('type_id').cumcount().astype(str))
df2['unique_id1'] = (df2['type_id'].astype(str) + '|' + 
                     df2.groupby('type_id').cumcount().astype(str))
print (df1)
   type_id  count unique_id1
0        1     12       1|0
1        1     11       1|1
2        1     15       1|2
3        4     16       4|0

print (df2)
   type_id  count  col3 unique_id1
0        1      8     1       1|0
1        3      6     5       3|0
2       76     15     7      76|0
3       12     16     3      12|0
4       11      5     4      11|0
5        1     17     7       1|1

df = df2[df2['count'] < df2['unique_id1'].map(df1.set_index('unique_id1')['count'])]
print (df)
   type_id  count  col3 unique_id
0        1      8     1       1|0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X