提问人:t3ahunt3r 提问时间:11/6/2023 最后编辑:cottontailt3ahunt3r 更新时间:11/7/2023 访问量:54
如何通过涉及两个数据帧中的值的计算来填充 pandas 列
How to fill a pandas column by calculation involving values from two dataframes
问:
我有两个数据帧,一个 () 为每个人保留一些基本数据baseDataframe
n
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>
第二个数据帧 () 用于保存这些个人的每个操作的数据actionDataframe
n
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
如何在没有显式循环的情况下做到这一点?
答:
2赞
cottontail
11/6/2023
#1
这里有一种方法,对于每个 ,使用最低值的索引(使用 找到)来过滤相应的值,这些值又映射到它们的 baseDataFrame 值并计算时间差。所需的列是以天为单位的时间差。请注意,如果 datetime 列已为 dtype,则无需再次转换为 datetime。n
actionID
groupby.idxmin
action1date
n
age
datetime64[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
评论
0赞
cottontail
11/7/2023
让我们在聊天中继续讨论。
评论