熊猫将一组中的行与上一组中的行进行比较

时间:2020-02-05 04:49:18

标签: python pandas group-by

如何确定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

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