我有两个数据框,一个为每个人保留一些基本数据
baseDataframe
n date1 age
0 1135 2021-05-08 <NA>
1 1339 2021-08-02 <NA>
2 1456 2021-08-07 <NA>
3 5765 2021-01-02 <NA>
4 6566 2021-05-12 <NA>
5 7756 2021-06-22 <NA>
还有第二个数据框,用于保存这些人的每个动作的数据 n
actionDataframe
n actionID action1date
0 1135 1 2022-04-01
1 1135 2 2022-06-11
2 1135 3 2022-08-04
3 1339 1 2022-05-03
4 1339 2 2022-07-21
5 1456 1 2022-08-07
6 1456 2 2022-09-30
7 1456 3 2022-11-11
8 1456 4 2023-01-12
9 5765 1 2022-04-22
10 5765 2 2022-06-11
11 6566 1 2022-04-02
12 7756 1 2022-12-12
13 7756 2 2023-02-01
现在我想通过从
age
中获取每个 baseDataframe
的最低 action1date
的 actionID
来填充 n
的 actionDataframe
列,并从中减去 date1
中的 baseDataframe
.
我之前使用 for 循环完成了所有工作(将跳过该代码)
for n in baseDataframe.index
# calculations here
但现在我读到迭代数据帧是不好的做法并且很慢。现在我想知道是否有选项可以完成一些更复杂的事情,例如我尝试使用内置函数执行的任务以及不执行的任务。我只是找不到合适的关键字来谷歌和查找。
我正在寻找的最终结果:
n date1 age
0 1135 2021-05-08 328
1 1339 2021-08-02 274
2 1456 2021-08-07 365
3 5765 2021-01-02 475
4 6566 2021-05-12 325
5 7756 2021-06-22 538
这是一种方法,对于每个
n
,最早的 action1date
(在日期时间列上使用 groupby.min
找到)映射到其基本 n
值,并计算时间差。所需的列age
是以天为单位的时间差。
action_df['action1date'] = pd.to_datetime(action_df['action1date'])
action_dates = action_df.groupby('n')['action1date'].min()
base_df['age'] = (base_df['n'].map(action_dates) - pd.to_datetime(base_df['date1'])).dt.days