根据列值比较pandas中的2个数据帧

时间:2018-01-14 08:07:36

标签: python pandas pandas-groupby

我有2个数据框。 第一个"named x"具有以下格式:

             ISBN  Age Category  Count
20     000649840X  Middle Adult      6
21     000649840X   Young Adult     16

其中相同的ISBN有多行具有不同的类别。

其他数据框"named y"每个ISBN值都有一行。我想在最后一个数据帧中为每个类别计数创建一个列,其中最终结果应如下所示:

ISBN      Middle Adult Count       Young Adult Count

我试过

y["Young Adult Count"] = x[(x['Age Category'] == 'Young Adult') & (y['ISBN] == x['ISBN])]['Count']

但它不起作用

2 个答案:

答案 0 :(得分:2)

groupby + sum + unstack应该有效。

df.groupby(['ISBN', 'Age Category'])\
  .Count.sum()\
  .unstack()\
  .add_suffix(' Count')

Age Category  Middle Adult Count  Young Adult Count
ISBN
000649840X                     6                 16

如果您想明确过滤这两个类别,请先使用isin -

过滤
cat = ['Middle Adult', 'Young Adult']
df = df[df['Age Category'].isin(cat)]

现在,执行groupby

答案 1 :(得分:2)

我认为您需要this pivot_table(默认左连接,如果某些ISBN缺少获取NaN行)另一个DataFrame

print (df1)
         ISBN  Age Category  Count
0  000649840X  Middle Adult      6
1  000649840X   Young Adult     16


print (df2)
         ISBN
0  000649840X
1  0001111111

df3 = df1.pivot_table(index='ISBN', 
                      columns='Age Category', 
                      values='Count', 
                      aggfunc='sum')
df = df2.join(df3.add_suffix(' Count'), on='ISBN')
print (df)
         ISBN  Middle Adult Count  Young Adult Count
0  000649840X                 6.0               16.0
1  0001111111                 NaN                NaN

对于内部联接使用参数how='inner'

df = df2.join(df3.add_suffix(' Count'), on='ISBN', how='inner')
print (df)
         ISBN  Middle Adult Count  Young Adult Count
0  000649840X                   6                 16