python - 对 pandas 中的分组应用操作

标签 python pandas grouping

编辑:我并不是专门研究如何完成这个特定的操作工作,我需要这种行为来实现更复杂的功能。因此,为了解决这个问题,请假设该函数进行分组并返回一个对其进行了某些操作的数据帧(但没有求和)。

假设我有一个像这样的数据框:

import pandas as pd

df = pd.DataFrame({
    "page": [
        1, 1, 1,
        2, 2, 2,
        3, 3, 3, 3
    ],
    "x": [
            10, 12, 21, 
            0, 5, 7, 
            1, 10, 33, 40
    ]
})

我想计算每个x在其相关页面内的差异。

我的设计方式是这样的:

def compute_diff(group):
    return group.assign(
        diff = [
            *(group.x.values[1:] - group.x.values[0:len(group.x)-1]),
            None
        ]
    )

df.groupby('page').apply(compute_diff)

现在这工作正常,但问题是我得到了数据帧的数据帧,即:

        page    x   diff
page                
1   0   1   10  2.0
    1   1   12  9.0
    2   1   21  NaN
2   3   2   0   5.0
    4   2   5   2.0
    5   2   7   NaN
3   6   3   1   9.0
    7   3   10  23.0
    8   3   33  7.0
    9   3   40  NaN

请注意,我的索引有点困惑,我怎样才能清理它并获得看起来更像这样的格式:

    page    x   diff                
0   1   10  2.0
1   1   12  9.0
2   1   21  NaN
3   2   0   5.0
4   2   5   2.0
5   2   7   NaN
6   3   1   9.0
7   3   10  23.0
8   3   33  7.0
9   3   40  NaN

我已经尝试了一些 unstack 和 reset_index 的操作,但结果并不完全是我想要的,并且文档中没有任何我注意到的内容。

最佳答案

使用GroupBy.diff 来代替怎么样?

df.assign(diff=df.groupby('page').x.diff())

   page   x  diff
0     1  10   NaN
1     1  12   2.0
2     1  21   9.0
3     2   0   NaN
4     2   5   5.0
5     2   7   2.0
6     3   1   NaN
7     3  10   9.0
8     3  33  23.0
9     3  40   7.0
<小时/>

如果您坚持使用apply,也可以使用group_keys=False:

df.groupby('page', as_index=False, group_keys=False).apply(compute_diff)

   page   x  diff
0     1  10   2.0
1     1  12   9.0
2     1  21   NaN
3     2   0   5.0
4     2   5   2.0
5     2   7   NaN
6     3   1   9.0
7     3  10  23.0
8     3  33   7.0
9     3  40   NaN

关于python - 对 pandas 中的分组应用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490129/

相关文章:

python - 在新编译的 python 上安装 pip

python - 如何在子类中调用父类?

python - 在 Pandas 中编码字符串特征

r - 根据前 5 个值汇总 R 中的多列

python - 如何在二进制张量中找到相邻真值组?

sql - 按凌晨 4 点到凌晨 4 点的值分组 SQL Server

python - 如何根据上一行和下一行的条件在 Pandas Dataframe 上创建新列?

python - 是否可以在中间件中过滤掉一些数据库行?

python - 在 django rest 框架中对 pandas DataFrame 重复操作

python - 在 Python 中对 csv 进行排序 - 使用字符串分隔符拆分第一列,然后通过第二个元素排序,然后通过第一个元素排序