大熊猫中分组的条件比率

Posted

技术标签:

【中文标题】大熊猫中分组的条件比率【英文标题】:Conditional ratio with group by in pandas 【发布时间】: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 我改了 【参考方案1】:

简单:)

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 

【讨论】:

【参考方案2】:

您可能需要更正您的预期输出,然后在过滤器后使用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

【讨论】:

感谢它的工作!但是,对于扩展示例,它不起作用,因为索引列可能有重复。我提供了一个额外的例子。

以上是关于大熊猫中分组的条件比率的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中按多个条件分组[重复]

熊猫按时间和分组滚动条件总和

熊猫:有条件的分组

相邻行熊猫的分组条件总和

熊猫:分组并根据条件在每个组中删除行

在使用条件聚合进行分组时选择多个第 n 个值 - 熊猫