Python 根据基于n-1索引记录的值进行分组
在以下数据中:Python 根据基于n-1索引记录的值进行分组,python,pandas,group-by,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 在序列中获得以下结果(或将计算序列附加到最后一列的数据帧)是否可行 这些值由记录的值减去记录的前一条记录(即,如果其记录在Adam上,则表示Peter的记录)值计算得出。但是,我也希望基于组变量得到它,这意味着我不希望基于Jared的值得到Bob的值,因为这两个记录的组值是不同的
Name, Group, Value
Mike, A, 0
Peter, A, 5
Adam, A, 12
Jared, A, 18
Bob, B, 0
Jason, B, 1
Dan, B, 9
在序列中获得以下结果(或将计算序列附加到最后一列的数据帧)是否可行
这些值由记录的值
减去记录的前一条记录(即,如果其记录在Adam
上,则表示Peter
的记录)值
计算得出。但是,我也希望基于组
变量得到它,这意味着我不希望基于Jared
的值
得到Bob的值,因为这两个记录的组
值是不同的-我只在每个特定的组
变量中计算它
我不确定是否只能在熊猫身上做。我使用pandas 0.13。您可以直接使用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
并在NAN中填入0:
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
[14]中的:res[pd.isnull(res)|(res<0)]=0
在[15]中:res
出[15]:
0 0
1 5
2 7
3 6
4 0
5 1
6 8
名称:Value,数据类型:float64
以下各项应起作用:
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
或者,您可以在分组方式中使用shift键
/应用
:
df['new'] = df.groupby('Group')['Value'].apply(lambda x: x - x.shift(1))
print df.fillna(0)
哇!太棒了!但是我不喜欢这个语法。。。非常感谢您的回答。@user2360798我更喜欢使用[]语法访问列:df.groupby('Group')['Value'].shift()
,您觉得这种语法更好吗?啊,我说的是在一个用花括号括起来的对象上调用一个方法(fillna
),我通常不喜欢这种方法。我更喜欢按照卡尔的建议使用apply
。@user2360798是的,它不是很像python。。。你总是可以在下一行对结果进行填充。shift没有默认值arg.:S@user2360798记住diff方法可以做到这一点,更好!谢谢我喜欢apply
解决方案!
df['new'] = df.groupby('Group')['Value'].apply(lambda x: x - x.shift(1))
print df.fillna(0)