Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据基于n-1索引记录的值进行分组_Python_Pandas_Group By - Fatal编程技术网

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)