使用该数据帧和第二个数据帧中的值进行计算,填充 pandas 数据帧中的值(没有 for 循环)

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

我有两个数据框,一个为每个人保留一些基本数据

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
pandas dataframe loops iteration
1个回答
0
投票

这是一种方法,对于每个

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

© www.soinside.com 2019 - 2024. All rights reserved.