在以下数据中:
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。
答案 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:
填写NaNIn [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)