【问题标题】:group data using pandas, but how do I keep the order of the group and do math on two of the columns rows?使用 pandas 对数据进行分组,但是如何保持组的顺序并在两列行上进行数学运算?
【发布时间】:2019-04-19 19:11:36
【问题描述】:

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 row2 - X row1)

    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 行,diff 将为我提供任意两个之间的距离值,而不是该组的总距离。

【问题讨论】:

标签: pandas dataframe pandas-groupby


【解决方案1】:

扯掉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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多