在 R 中,我可以使用多个数据列汇总数据,如下所示:library(dplyr):
A = B %>%
group_by(col1,col2) %>%
summarize(newcol = sum(col3)/sum(col4))
Run Code Online (Sandbox Code Playgroud)
但是在python的pandas的dataframes中,如何一步执行相同的操作呢?
我可以分两步完成。第1步:
A = B.groupby(['col1','col2']).agg({'col3': 'sum','col4':'sum'})
Run Code Online (Sandbox Code Playgroud)
第2步:
A['newcol'] = A['col3']/A['col4']
Run Code Online (Sandbox Code Playgroud)
您需要将assign与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
Run Code Online (Sandbox Code Playgroud)
如果您只需要新列,请使用 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
Run Code Online (Sandbox Code Playgroud)
如果您在大数据集上使用它,请避免 apply 并使用 eval 代替。
(df.groupby(['col1','col2'])
.agg({'col3': 'sum','col4':'sum'})
.eval('col3 / col4'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2124 次 |
| 最近记录: |