如何解决新列中的Pandas groupby和agg值
import pandas as pd
df = pd.DataFrame({'company' : [ABC,ABC,XYZ,XYZ],'tin': ['5555','1111','5555','2222']
})
如果大型数据集中的值相等,我不知道如何按“锡”列分组。
Desirable result:
df = pd.DataFrame({'company' : [ABC,'2222'],'column' : ['text' ABC and XYZ,None,'text' ABC and XYZ,None]
})
解决方法
我相信您需要:
df1 = pd.DataFrame({ 'tin': ['5555','5555'],'name' : 'AAA,BBB'.split(',')})
print (df1)
tin name
0 5555 AAA
1 5555 BBB
df2 = pd.DataFrame({'company' : 'ABC,ABC,XYZ,XYZ'.split(','),'tin': ['5555','1111','5555','2222','2222'],AAA,BBB,')})
print (df2)
company tin name
0 ABC 5555 AAA
1 ABC 1111 AAA
2 XYZ 5555 AAA
3 XYZ 2222 AAA
4 ABC 5555 BBB
5 ABC 1111 BBB
6 XYZ 5555 BBB
7 XYZ 2222 BBB
首先使用DataFrame.merge
进行测试,以测试名为df1
的第一个DataFrame与参数indicator=True
以及how ='left'是否用于左连接:
df = df2.merge(df1,on=['tin','name'],how='left',indicator=True)
print (df)
company tin name _merge
0 ABC 5555 AAA both
1 ABC 1111 AAA left_only
2 XYZ 5555 AAA both
3 XYZ 2222 AAA left_only
4 ABC 5555 BBB both
5 ABC 1111 BBB left_only
6 XYZ 5555 BBB both
7 XYZ 2222 BBB left_only
然后仅按boolean indexing
过滤两行:
df = df[df['_merge'].eq('both')]
print (df)
company tin name _merge
0 ABC 5555 AAA both
2 XYZ 5555 AAA both
4 ABC 5555 BBB both
6 XYZ 5555 BBB both
最后两列的总和,并由DataFrame.join
分配回来:
s = df.groupby(['tin','name'])['company'].agg(' and '.join).rename('new')
df = df2.join(s,'name'])
print (df)
company tin name new
0 ABC 5555 AAA ABC and XYZ
1 ABC 1111 AAA NaN
2 XYZ 5555 AAA ABC and XYZ
3 XYZ 2222 AAA NaN
4 ABC 5555 BBB ABC and XYZ
5 ABC 1111 BBB NaN
6 XYZ 5555 BBB ABC and XYZ
7 XYZ 2222 BBB NaN
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。