【发布时间】:2019-03-06 16:21:14
【问题描述】:
我想对第 1 列进行分组,然后从第 2 列获取值的总和,以第 3 列中的值为条件,然后除以第 2 列中的总和,仍然按第 1 列分组。
下面给出一个例子:
d = {'col1': [1, 2, 1, 2], 'col2': [3, 4, 2, 7], 'col3': [1, 1, 0, 0]}
df = pd.DataFrame(data=d)
col1 col2 col3
0 1 3 1
1 2 4 1
2 1 2 0
3 2 7 0
我想创建一个新列:col4。对于这一列,我按 col1 分组,然后得到 col3 为 1 的 col2 值的百分比除以 col2 的总分组总和。这样我最终会得到以下结果。 (我把它放在分数中以便于计算。
col1 col2 col3 col4
0 1 3 1 3/5
1 2 4 1 4/11
2 1 2 0 3/5
3 2 7 0 4/11
我尝试了以下方法,但不幸的是这不起作用:
df.col4 = df.groupby(['col1']).transform(lambda x: np.where(x.col3 == 1, x.col2, 0).sum()) / df.groupby(['col1']).col2.transform('sum')
编辑 |扩展示例
我扩展了这个例子,因为文提供的解决方案只涵盖了上面的简单例子。
d = {'col1': [1, 2, 1, 2, 1, 2], 'col2': [3, 4, 2, 7, 6, 8], 'col3': [1, 1, 0, 0, 1, 0]}
df = pd.DataFrame(data=d)
col1 col2 col3
0 1 3 1
1 2 4 1
2 1 2 0
3 2 7 0
4 1 6 1
5 2 8 0
编辑 |可能的解决方案
我找到了一个可能的解决方案。我想以一种更简洁的方式来做这件事,但这是可读且非常简单的。当然,任何组合这两行代码的替代方案仍然值得赞赏。
df['col4'] = np.where(df.col3 == 1, df.col2, 0)
df['col4'] = df.groupby(['col1']).col4.transform('sum') / df.groupby(['col1']).col2.transform('sum')
【问题讨论】:
-
col1 ==2 col3 中没有 1
-
谢谢@Wen 我改了
标签: python pandas group-by sum conditional