Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对熊猫中的分组应用操作_Python_Pandas_Grouping - Fatal编程技术网

Python 对熊猫中的分组应用操作

Python 对熊猫中的分组应用操作,python,pandas,grouping,Python,Pandas,Grouping,编辑:我不是专门研究如何完成这项特定的操作工作,我需要这种行为来实现更复杂的功能。因此,为了回答这个问题,请假设该函数接受一个分组并返回一个对其进行了一些操作(但没有求和)的数据帧 假设我有这样一个数据帧: import pandas as pd df = pd.DataFrame({ "page": [ 1, 1, 1, 2, 2, 2, 3, 3, 3, 3 ], "x": [ 10, 12,

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

假设我有这样一个数据帧:

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
    ]
})
    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
我想计算每个
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
请注意,我的索引有点混乱,我如何才能清理它并获得更像这样的格式:

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
    ]
})
    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\u 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

使用
.iloc
diff

df['diff']=df.groupby('page').x.apply(lambda x : -x.iloc[::-1].diff()).sort_index(level=0).values
df
Out[106]: 
   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

我以那次行动为例。我的实际代码稍微复杂一些。我希望得到一个“行动”解决方案。@asosnovsky现在好点了吗?