计算另一个数据框中的一行pandas数据框

Rat*_*rit 3 python pandas

我想在一个数据框中添加一列,其中包含另一个数据框中的匹配数。例如,

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','yes','yes','no','no','no','no','no','no'],
                    'B':['L','L','M','M','H','H','L','L','M','M','H','H'],
                    'C':[True,False,True,False,True,False,True,False,True,False,True,False]})
Run Code Online (Sandbox Code Playgroud)

对于 df1 中的每一行,我想知道它在 df2 中的计数

df2 = pd.DataFrame({'A':['yes','yes','no','yes','no','yes','yes','no','no','no'],
                   'B':['L','M','M','L','M','M','H','L','H','M'],
                   'C':[True,True,True,True,True,False,False,False,False,False]})
Run Code Online (Sandbox Code Playgroud)

通过在 df1 中添加“count”列,预期输出如下:

index     A     B     C     count
0        yes    L   True        2
1        yes    L   False       0
2        yes    M   True        1
3        yes    M   False       1
4        yes    H   True        0
5        yes    H   False       1
6         no    L   True        0
7         no    L   False       1
8         no    M   True        2
9         no    M   False       1
10        no    H   True        0
11        no    H   False       1
Run Code Online (Sandbox Code Playgroud)

我可以知道执行此操作的 pythonic 方法吗?先感谢您。

jez*_*ael 5

您可以尝试使用mergeof with 。最后您可以使用with 列 来替换为:groupbydf2sizefillnaNaN0

print df2.groupby(['A','B','C']).size().reset_index(name='count')
     A  B      C  count
0   no  H  False      1
1   no  L  False      1
2   no  M  False      1
3   no  M   True      2
4  yes  H  False      1
5  yes  L   True      2
6  yes  M  False      1
7  yes  M   True      1

print pd.merge(df1, 
               df2.groupby(['A','B','C']).size().reset_index(name='count'),
               on=['A','B','C'],
               how="left").fillna({'count': 0})

      A  B      C  count
0   yes  L   True      2
1   yes  L  False      0
2   yes  M   True      1
3   yes  M  False      1
4   yes  H   True      0
5   yes  H  False      1
6    no  L   True      0
7    no  L  False      1
8    no  M   True      2
9    no  M  False      1
10   no  H   True      0
11   no  H  False      1
Run Code Online (Sandbox Code Playgroud)