Pandas groupby.diff() 未返回预期输出
Pandas groupby.diff() not returning expected output
我有一个外部组和一个内部组,我希望根据外部组找出每个内部组内的差异。通常,我可以使用 groupby
将内部组嵌套在每个外部组中,但是由于某种原因,groupby
returns 的 diff
函数是平面向量而不是嵌套数组.
df = pd.DataFrame({'inner':list('aabbccddee'),'outer':[0,0,1,1,0,0,1,1,0,0],
'value':np.random.randint(0,100,10)})
inner outer value
0 a 0 78
1 a 0 68
2 b 1 78
3 b 1 22
4 c 0 53
5 c 0 25
6 d 1 82
7 d 1 38
8 e 0 2
9 e 0 39
如果我想要 sum
,例如,对于每个外部组的内部组,我只需使用 groupby
:
In [19]: df.groupby(['outer','inner']).sum()
Out[19]:
value
outer inner
0 a 146
c 78
e 41
1 b 100
d 120
以上是正确的输出,它适用于所有其他函数 除了 diff
。当我使用 diff
时,我希望以与上述类似的格式输出,但我得到:
In [20]: df.groupby(['outer','inner']).diff()
Out[20]:
value
0 NaN
1 -10.0
2 NaN
3 -56.0
4 NaN
5 -28.0
6 NaN
7 -44.0
8 NaN
9 37.0
上面等价于df.groupby(['inner']).value.diff()
所以好像groupby
没有考虑外组。我可以找到解决这个问题的方法,但是使用 groupby
会更优雅和简洁。有谁知道为什么会发生这种情况以及如何补救?
s.diff()
、cumsum
等函数是非聚合函数,因此您会得到一系列形状的结果,您可以在此处使用 np.diff()
,示例如下:
print(df.groupby(['outer','inner'])['value'].apply(lambda x: np.diff(x).item()))
outer inner
0 a -10
c -28
e 37
1 b -56
d -44
我有一个外部组和一个内部组,我希望根据外部组找出每个内部组内的差异。通常,我可以使用 groupby
将内部组嵌套在每个外部组中,但是由于某种原因,groupby
returns 的 diff
函数是平面向量而不是嵌套数组.
df = pd.DataFrame({'inner':list('aabbccddee'),'outer':[0,0,1,1,0,0,1,1,0,0],
'value':np.random.randint(0,100,10)})
inner outer value
0 a 0 78
1 a 0 68
2 b 1 78
3 b 1 22
4 c 0 53
5 c 0 25
6 d 1 82
7 d 1 38
8 e 0 2
9 e 0 39
如果我想要 sum
,例如,对于每个外部组的内部组,我只需使用 groupby
:
In [19]: df.groupby(['outer','inner']).sum()
Out[19]:
value
outer inner
0 a 146
c 78
e 41
1 b 100
d 120
以上是正确的输出,它适用于所有其他函数 除了 diff
。当我使用 diff
时,我希望以与上述类似的格式输出,但我得到:
In [20]: df.groupby(['outer','inner']).diff()
Out[20]:
value
0 NaN
1 -10.0
2 NaN
3 -56.0
4 NaN
5 -28.0
6 NaN
7 -44.0
8 NaN
9 37.0
上面等价于df.groupby(['inner']).value.diff()
所以好像groupby
没有考虑外组。我可以找到解决这个问题的方法,但是使用 groupby
会更优雅和简洁。有谁知道为什么会发生这种情况以及如何补救?
s.diff()
、cumsum
等函数是非聚合函数,因此您会得到一系列形状的结果,您可以在此处使用 np.diff()
,示例如下:
print(df.groupby(['outer','inner'])['value'].apply(lambda x: np.diff(x).item()))
outer inner
0 a -10
c -28
e 37
1 b -56
d -44