我想对第1列进行分组,然后以第3列中的值为条件,从第2列中获取值的总和,然后将其除以第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分组,然后获得col2值的百分比,其中col3为1除以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')
编辑|扩展示例
我扩展了该示例,因为Wen所提供的解决方案仅涵盖了上面的简单示例。
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')
答案 0 :(得分:0)
您可能需要更正预期的输出,然后在过滤器之后使用map
df.col1.map(df.loc[df.col3==1,].set_index('col1').col2)/df.groupby(['col1']).col2.transform('sum')
Out[566]:
0 0.600000
1 0.363636
2 0.600000
3 0.363636
dtype: float64
答案 1 :(得分:0)
简单:)
d = {'col1': [1, 2, 1, 2], 'col2': [3, 4, 2, 7], 'col3': [1, 1, 0, 0]}
df = pd.DataFrame(data=d)
df['col4'] = 0.0
def con(data):
part_a = sum(data[data['col3'] == 1]['col2'])
part_b = sum(data['col2'])
data.col4 = part_a/part_b
return data
df.groupby('col1').apply(con)
输出
col1 col2 col3 col4
0 1 3 1 0.600000
1 2 4 1 0.363636
2 1 2 0 0.600000
3 2 7 0 0.363636