在R中,我可以使用多个数据列汇总数据,如下所示: 库(dplyr):
A = B %>%
group_by(col1,col2) %>%
summarize(newcol = sum(col3)/sum(col4))
但是在python的pandas数据帧中,我如何一步完成相同的操作?
我可以分两步完成。 第1步:
A = B.groupby(['col1','col2']).agg({'col3': 'sum','col4':'sum'})
第2步:
A['newcol'] = A['col3']/A['col4']
答案 0 :(得分:3)
您需要使用带有lambda表达式的赋值:
df = pd.DataFrame({'col1': list('aaabbb'),
'col2': list('xyxyxy'),
'col3': np.random.randn(6),
'col4': np.random.randn(6)})
df
Out:
col1 col2 col3 col4
0 a x -2.276155 0.323778
1 a y -0.367525 -2.570142
2 a x -0.672530 2.265560
3 b y 0.588741 0.193499
4 b x -1.368829 0.717997
5 b y 1.012271 1.354408
(df.groupby(['col1','col2'])
.agg({'col3': 'sum','col4':'sum'})
.assign(newcol=lambda x: x['col3']/x['col4']))
Out:
col4 col3 newcol
col1 col2
a x 2.589338 -2.948686 -1.138780
y -2.570142 -0.367525 0.142998
b x 0.717997 -1.368829 -1.906453
y 1.547907 1.601012 1.034308
如果您只需要新列,请使用apply:
df.groupby(['col1','col2']).apply(lambda x: x['col3'].sum() / x['col4'].sum())
Out:
col1 col2
a x -1.138780
y 0.142998
b x -1.906453
y 1.034308
dtype: float64
如果您在大数据集上使用此功能,请避免应用并使用eval。
(df.groupby(['col1','col2'])
.agg({'col3': 'sum','col4':'sum'})
.eval('col3 / col4'))
答案 1 :(得分:0)
使用 datar
,您可以像在 R 中那样做:
from datar import f
from datar.base import sum
from datar.dplyr import group_by, summarise
A = B >> \
group_by(f.col1,f.col2) >> \
summarize(newcol = sum(f.col3)/sum(f.col4))