尊重分组的列间偏移差异
假设我在Pandas中有两列数据。我想计算这两列之间的“偏移差”,并且要遵循分组的边界。
换句话说,假设我想要 diff = A-B
,那么从符号上看我想要的是:
df.loc[t,diff] = df.loc[t+1,A] - df.loc[t,B]
df
可以有任何类型的索引(包括多重索引)
我该如何对所有行进行这个操作呢?对于 df.loc[-1,diff]
的结果应该是 NaN
。
第一次尝试:
grouped = df.groupby(level='some_level')
for key in grouped.groups.keys():
this_group = grouped.get_group(key)
this_group['diff'] = this_group['A'].shift() - this_group['B']
但是我得到的是:
/Users/josh/anaconda/envs/py27/bin/ipython:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
#!/Users/josh/anaconda/envs/py27/python.app/Contents/MacOS/python
第二次尝试:
grouped = df.groupby(level='some_group')
diff = grouped['A'].shift() - grouped['B']
返回的是
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/ops.pyc in wrapper(left, right, name)
501 if hasattr(lvalues, 'values'):
502 lvalues = lvalues.values
--> 503 return left._constructor(wrap_results(na_op(lvalues, rvalues)),
504 index=left.index, name=left.name,
505 dtype=dtype)
NotImplementedError
1 个回答
6
你只需要使用 shift
这个功能就可以了:
df['diff']= df.A.shift() - df.B
默认情况下,它会向下移动1个位置,具体可以查看 在线文档。
如果你想在分组后使用这个功能,可以这样做:
df['diff'] = df.groupby('A').shift(1) - df['B']
举个例子:
In [48]:
df = pd.DataFrame({'A':[1,1,1,2,2,3,4,4,5,7], 'B':arange(10)})
print(df)
gp = df.groupby('A')
A B
0 1 0
1 1 1
2 1 2
3 2 3
4 2 4
5 3 5
6 4 6
7 4 7
8 5 8
9 7 9
[10 rows x 2 columns]
In [49]:
gp.head(10)
Out[49]:
A B
A
1 0 1 0
1 1 1
2 1 2
2 3 2 3
4 2 4
3 5 3 5
4 6 4 6
7 4 7
5 8 5 8
7 9 7 9
[10 rows x 2 columns]
In [52]:
gp['A'].shift(1) - df['B']
Out[52]:
0 NaN
1 0
2 -1
3 NaN
4 -2
5 NaN
6 NaN
7 -3
8 NaN
9 NaN
dtype: float64