将外键从一个数据帧追加到另一数据帧的最快方法

时间:2019-12-02 13:36:14

标签: python pandas

这让我感到沮丧,因为我确信这很容易做到,但是我一生都无法提出最佳解决方案。

基本上,我有df1,其中有vehiclecheckpoint列,它们代表比赛中每辆车何时在单圈中通过每个检查站。但是没有记录同一种族的某些检查站。

然后我有df2,其中包含一列checkpoint,其中包含应该包含在df1中的检查点数据。

我正在尝试找到一种快速的方法,将这些检查点实质上添加到lap中的每个唯一df1值中。

例如: df1 = pd.DataFrame({'vehicle': [1,1,2,2,3,3], 'checkpoint': [1,5,1,5,1,5]}) df2 = pd.DataFrame({"checkpoints": range(2,5)})

我想要的是快速生成一个数据帧,该数据帧将所有缺少df2的检查点添加到df1中的每辆车上,因此对于3个唯一的车辆中的每一个,结果数据帧都具有1到5的检查点。

预期的输出将类似于以下内容,但是检查点和车辆不一定必须井井有条。重要的是,所有3个车辆都占了所有5个检查站:

vehicle checkpoints
0   1   1
1   1   2
2   1   3
3   1   4
4   1   5
5   2   1
6   2   2
7   2   3
8   2   4
9   2   5
10  3   1
11  3   2
12  3   3
13  3   4
14  3   5

I've come up with solutions using list comprehensions and concatenation but it's far too slow on larger datasets. I'm not the most at ease with using apply either, so if there's a way to use apply or an entirely different and faster solution, I would be very much appreciative.

If you need more information don't hesitate to ask.


1 个答案:

答案 0 :(得分:1)

import pandas as pd
df1 = pd.DataFrame({'vehicle': [1,1,2,2,3,3], 'checkpoint': [1,5,1,5,1,5]}) 
df2 = pd.DataFrame({"checkpoint": range(2,5)})
基于

merge 的解决方案

df1的{​​{1}}与唯一车辆的完整外部合并,以及df1的缺少检查点的外部合并:

df2

输出如OP所示。


基于

pd.concat([df1, pd.merge(df1[['vehicle']].drop_duplicates().assign(temp=1), df2.assign(temp=1), how='outer').drop('temp', axis=1)] ).sort_values(['vehicle', 'checkpoint']).reset_index(drop=True) 的解决方案

reindex