如何确定col X
中行之间,但组之间而不是组内的差异。因此,组内的diff
值应为ffill
。
df = pd.DataFrame({
'Time' : [1,1,2,2,3,3],
'X' : [1,1,3,3,6,6],
'Y' : [1,1,1,1,2,2],
})
df['X'] = df['X'].diff()
df['X'] = df.groupby('Time')['X'].diff()
预期输出:
Time X Y
0 1 0 1
1 1 0 1
2 2 2 1
3 2 2 1
4 3 3 2
5 3 3 2
答案 0 :(得分:1)
如果组内的值相等(但每个组的行数不相等),则可以通过用上一组的值减去组中的所有行来实现。
df['X'] - df['Time'].map(df.groupby('Time')['X'].max().shift()).fillna(df['X'])
0 0.0
1 0.0
2 2.0
3 2.0
4 3.0
5 3.0
dtype: float64
详细信息
第一步是找到每个组中的唯一值(我使用max()
,但也可以使用unique()
或first()
):
df.groupby('Time')['X'].max()
Time
1 1
2 3
3 6
Name: X, dtype: int64
下一步,将它们向下移:
_.shift()
Time
1 NaN
2 1.0
3 3.0
Name: X, dtype: float64
将其映射回“时间”(石斑鱼):
df['Time'].map(_)
0 NaN
1 NaN
2 1.0
3 1.0
4 3.0
5 3.0
Name: Time, dtype: float64
用“ X”填充第一组NaN:
_.fillna(df['X'])
0 1.0
1 1.0
2 1.0
3 1.0
4 3.0
5 3.0
Name: Time, dtype: float64
现在您有了RHS。只需从“ X”中减去它即可。
答案 1 :(得分:0)
如果每个组都有固定的行,则可以
>>> df.X = df.X.diff(periods=2).fillna(0) # assumes all groups have two rows
>>> df
Time X Y
0 1 0.0 1
1 1 0.0 1
2 2 2.0 1
3 2 2.0 1
4 3 3.0 2
5 3 3.0 2