pandas:groupby仅在满足条件时才使用

时间:2016-12-01 16:19:30

标签: python pandas

我有以下多索引DataFrame:

        m     dist

a  a    2     5
   b    3     8
   c    4     12
   d    2     3
b  a    2     5
   b    3     8
   c    4     14
   d    2     27

我想基于算法计算新列。例如,对于(a,a),算法将是:

选择具有相同级别0索引的所有其他行: - > (a,a),(a,b),(a,c),(a,d)

从此选择:选择dist< = own dist的行 - > (a,a)和(a,d)

获取此选择的列m的总和 - > 2 + 2 = 4

这会产生以下数据帧:

        m     dist  s

a  a    2     5     4
   b    3     8     7
   c    4     12    11
   d    2     3     2
b  a    2     5     2
   b    3     8     5
   c    4     14    9
   d    2     27    11

通过遍历行,为每一行创建一个新的数据帧,选择具有正确dist的行并执行groupby,这将很容易。但是使用我当前的数据集,这太慢了。这可以通过一些不错的groupby / lambda魔法完成吗?

1 个答案:

答案 0 :(得分:3)

您可以按dist对数据框进行排序,然后在cumsum列上执行m

df['s'] = df.sort_values('dist').groupby(level=0).m.cumsum()

enter image description here

这假设dist列中没有重复项,如果有,请对按s分组的列dist进行进一步转换,并且第一级索引应满足:

df['s'] = df.groupby([df.index.get_level_values(0), 'dist']).s.transform('max')