Python 按数据分组并进行计算

Python 按数据分组并进行计算,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个如下所示的数据框,我根据B列的值对数据框重新排序 a=df.sort(['B','a'],升序=[True,False]) 然后,当A列相同时,我想计算B列中每个元素之间的差值。但如果列A仅包含单个数据点,则结果将为零 因此,首先我使用了groupby()来实现这一点 b=a['b'].groupby(df['a']) 然后我卡在这里,我知道我可以使用lambda x:abs(x[I]-x[I+1])甚至apply()函数来完成计算。但我还是没能完成 有人能给我一个提示或建议吗 # Wh

我有一个如下所示的数据框,我根据B列的值对数据框重新排序

a=df.sort(['B','a'],升序=[True,False])

然后,当A列相同时,我想计算B列中每个元素之间的差值。但如果列A仅包含单个数据点,则结果将为零

因此,首先我使用了
groupby()
来实现这一点

b=a['b'].groupby(df['a'])

然后我卡在这里,我知道我可以使用
lambda x:abs(x[I]-x[I+1])
甚至
apply()
函数来完成计算。但我还是没能完成

有人能给我一个提示或建议吗

# What I want to see in the result
A,B
a,0
b,0
c,0
d,0  # 5 minus 5
d,1  # 6 minus 5
d,1  # 7 minus 6
d,2  # 9 minus 7

在单成员组和多成员组情况下,采用
diff
将为第一个值生成一个nan,我们可以
fillna
使用0:

>>> df["B"] = df.groupby("A")["B"].diff().fillna(0)
>>> df
   A  B
0  a  0
1  b  0
2  c  0
3  d  0
4  d  1
5  d  1
6  d  2
这假设您想要保留的NAN尚未存在。如果需要,我们仍然可以做到这一点。

您可以做到:

df.groupby(level="A").B.diff().fillna(0)

A
a    0
b    0
c    0
d    0
d    1
d    1
d    2

“5减5”位是一种需要处理的特殊情况,你真的需要它吗?谢谢你的回答,如果数据是第一个(最小的)数据,我只想保持它为零,就像单个数据点一样。好吧,如果你有一个很好的理由,我不会反驳你比我快!
df.groupby(level="A").B.diff().fillna(0)

A
a    0
b    0
c    0
d    0
d    1
d    1
d    2