pandas groupby基于n-1索引记录的值

时间:2014-03-29 06:33:35

标签: python pandas group-by

在以下数据中:


Name, Group, Value

Mike, A, 0
Peter, A, 5
Adam, A, 12
Jared, A, 18
Bob, B, 0
Jason, B, 1
Dan, B, 9

在Series(或DataFrame中将计算的序列附加到最后一列)中得到以下结果是否可行?


0
5
7
6
0
1
8

这些值是由记录的Value减去记录的前一记录(即如果其记录在Adam上,这意味着Peter的记录){{1 }}。但是,我也希望在Value变量的基础上得到它,这意味着我不希望基于Group获得Bob的{​​{1}} s Value,因为这两个记录的Jared值不同 - 我只在每个特定Value变量中计算它。

我不确定它是否只能在熊猫上完成。我用pandas 0.13。

2 个答案:

答案 0 :(得分:3)

您可以直接使用diff groupby方法:

In [23]: df.groupby('Group').Value.diff(1).fillna(0)
Out[23]:
0    0
1    5
2    7
3    6
4    0
5    1
6    8
dtype: float64

与使用shift和subtract完全相同:

In [21]: df.groupby('Group').Value.shift()
Out[21]:
0   NaN
1     0
2     5
3    12
4   NaN
5     0
6     1
dtype: float64

并用0:

填写NaN
In [22]: (df.Value - df.groupby('Group').Value.shift()).fillna(0)
Out[22]:
0    0
1    5
2    7
3    6
4    0
5    1
6    8
dtype: float64

原始答案:

您只需将其与移位值列进行比较:

In [11]: df = pd.read_csv('foo.csv')

In [12]: res = df.Value - df.Value.shift()

In [13]: res
Out[13]:
0   NaN
1     5
2     7
3     6
4   -18
5     1
6     8
Name: Value, dtype: float64

看起来你想要制作NaN和底片0:

In [14]: res[pd.isnull(res) | (res < 0)] = 0

In [15]: res
Out[15]:
0    0
1    5
2    7
3    6
4    0
5    1
6    8
Name: Value, dtype: float64

答案 1 :(得分:2)

以下内容应该有效:

print df

  Group   Name  Value
0     A   Mike      0
1     A  Peter      5
2     A   Adam     12
3     A  Jared     18
4     B    Bob      0
5     B  Jason      1
6     B    Dan      9

same_group = df.Group == df.Group.shift(1)
df['new'] = (df.Value - df.Value.shift(1)).where(same_group,0)

print df

  Group   Name  Value  new
0     A   Mike      0    0
1     A  Peter      5    5
2     A   Adam     12    7
3     A  Jared     18    6
4     B    Bob      0    0
5     B  Jason      1    1
6     B    Dan      9    8

或者您可以在groupby / apply中使用shift:

df['new'] = df.groupby('Group')['Value'].apply(lambda x: x - x.shift(1))
print df.fillna(0)