我有一个具有以下结构的 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 方法链的示例,请将它们放在评论中,谢谢
如果我理解正确的话,你想要:
我认为简单的链接是不可能的,但你可以使用
:=
运算符:
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