使用熊猫对数据进行分组,但是如何保持组的顺序并对两个列行进行数学运算呢?

时间:2018-11-16 15:11:54

标签: pandas dataframe pandas-groupby

df:

    Time Name  X  Y
0   00   AA    0  0
1   30   BB    1  1
2   45   CC    2  2
3   60   GG:AB 3  3
4   90   GG:AC 4  4
5   120  AA    5  3

dataGroup = df.groupby

([pd.Grouper(key=Time,freq='30s'),'Name'])).sort_values(by=['Timestamp'],ascending=True)

我尝试在行上执行diff(),但它返回的是NaN或不期望的内容。

df.groupby('Name', sort=False)['X'].diff()

如何保持分组和时间排序,以及如何区分行和上一行(对于X和Y列)

预期输出: XDiff是AA组, XDiff第1行=(X第1行-原点(已知)) XDiff第2行=(X第2行-X第1行)

    Time Name  X  Y XDiff  YDiff
0   00   AA    0  0  0       0
5   120  AA    5  3  5       3
1   30   BB    1  1  0       0
6   55   BB    2  3  1       2
2   45   CC    2  2  0       0
3   60   GG:AB 3  3  0       0
4   90   GG:AC 4  4  0       0

很高兴看到每一组的总距离(即AA为5,BB为1) 在我的示例中,每个组只有几行,但是如果有100行,该差异将为我提供任意两个行之间的距离值,而不是该组的总距离值。

1 个答案:

答案 0 :(得分:0)

剥离https://stackoverflow.com/a/20664760/6672746,您可以使用lambda函数来计算XY的行之间的差。我还包括了两行来设置索引(在groupby之后)并对其进行排序。

df['x_diff'] = df.groupby(['Name'])['X'].transform(lambda x: x.diff()).fillna(0)
df['y_diff'] = df.groupby(['Name'])['Y'].transform(lambda x: x.diff()).fillna(0)
df.set_index(["Name", "Time"], inplace=True)
df.sort_index(level=["Name", "Time"], inplace=True)

输出:

            X  Y  x_diff  y_diff
Name  Time                      
AA    0     0  0     0.0     0.0
      120   5  3     5.0     3.0
BB    30    1  1     0.0     0.0
CC    45    2  2     0.0     0.0
GG:AB 60    3  3     0.0     0.0
GG:AC 90    4  4     0.0     0.0