Pandas DataFrame 中的链式方法分组和差异计算

问题描述 投票:0回答:1

我有一个具有以下结构的 Pandas DataFrame:

import pandas as pd

data = {
    'glob_order': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    'trans': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
    'chain': [1, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2],
    'date': ['1/08/2023', '2/08/2023', '3/08/2023', '4/08/2023', '5/08/2023', '6/08/2023', '7/08/2023', '8/08/2023', '9/08/2023', '10/08/2023', '11/08/2023']
}

df = pd.DataFrame(data)

# Convert 'date' column to datetime
df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')

print(df)

我想执行两个操作:

按“trans”和“chain”列对 DataFrame 进行分组,并从每个组中选择第一行。 创建一个名为“delta”的新列,表示每个组中当前日期与上一个日期之间的天数差异。

我尝试了以下代码:

(df
.groupby(['trans', 'chain'])
.first()
.assign(
 delta=lambda x: (x['date'] - x['date'].shift(1)).dt.total_seconds() / (60*60*24),
 ).reset_index()
 )

但是,我得到的输出并不符合预期。似乎在每个单独组的第一个增量计算中插入 NaN,这不是我想要的

链条 glob_order 日期 德尔塔
A 1 1 2023-08-01 NaN
A 2 3 2023-08-03 2.0
B 1 5 2023-08-05 2.0
B 2 7 2023-08-07 2.0
C 1 8 2023-08-08 1.0
C 2 10 2023-08-10 2.0

我想了解为什么会发生这种情况以及我需要做什么才能获得所需的输出。

这是我想要的输出

链条 glob_order 日期 德尔塔
A 1 1 2023-08-01 NaN
A 2 3 2023-08-03 2.0
B 1 5 2023-08-05
B 2 7 2023-08-07 2.0
C 1 8 2023-08-08
C 2 10 2023-08-10 2.0

如果有人可以为我提供一个使用类似于链接的方法的解决方案,以提高清晰度和可读性,我将不胜感激,因为我对 python 很陌生,所以如果你不喜欢链接,请不要对我生气。预先感谢您的帮助。

如果你现在在哪里可以找到很多关于 Pandas 方法链的示例,请将它们放在评论中,谢谢

python pandas methods method-chaining
1个回答
0
投票

如果我理解正确的话,你想要:

  • 作为第一步按“trans”/“chain”分组,获取第一行
  • 作为第二步按“trans”分组并获得天数之间的差异

我认为简单的链接是不可能的,但你可以使用

:=
运算符:

df = (
    (df := df.groupby(["trans", "chain"]).first())
    .assign(delta=df.groupby("trans", group_keys=False)["date"].diff().dt.days)
    .reset_index()
)
print(df)

打印:

  trans  chain  glob_order       date  delta
0     A      1           1 2023-08-01    NaN
1     A      2           3 2023-08-03    2.0
2     B      1           5 2023-08-05    NaN
3     B      2           7 2023-08-07    2.0
4     C      1           8 2023-08-08    NaN
5     C      2          10 2023-08-10    2.0
© www.soinside.com 2019 - 2024. All rights reserved.