如何通过涉及两个数据帧中的值的计算来填充 pandas 列

How to fill a pandas column by calculation involving values from two dataframes

提问人:t3ahunt3r 提问时间:11/6/2023 最后编辑:cottontailt3ahunt3r 更新时间:11/7/2023 访问量:54

问:

我有两个数据帧,一个 () 为每个人保留一些基本数据baseDataframen

      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>

第二个数据帧 () 用于保存这些个人的每个操作的数据actionDataframen

       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

现在我想通过从中获取每个最低值并从中减去来填充 的列。agebaseDataframeaction1dateactionIDnactionDataframedate1baseDataframe

我之前让所有这些都使用 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

如何在没有显式循环的情况下做到这一点?

Python pandas 数据帧 循环 group-by

评论


答:

2赞 cottontail 11/6/2023 #1

这里有一种方法,对于每个 ,使用最低值的索引(使用 找到)来过滤相应的值,这些值又映射到它们的 baseDataFrame 值并计算时间差。所需的列是以天为单位的时间差。请注意,如果 datetime 列已为 dtype,则无需再次转换为 datetime。nactionIDgroupby.idxminaction1datenagedatetime64[ns]

lowest_actionID_per_n = actionDataframe.groupby('n')['actionID'].idxmin()
action_dates = actionDataframe.loc[lowest_actionID_per_n, ['n', 'action1date']].set_index('n').squeeze()
baseDataframe['age'] = (pd.to_datetime(baseDataframe['n'].map(action_dates)) - pd.to_datetime(baseDataframe['date1'])).dt.days

result

评论

0赞 cottontail 11/7/2023
让我们在聊天中继续讨论