这让我感到沮丧,因为我确信这很容易做到,但是我一生都无法提出最佳解决方案。
基本上,我有df1
,其中有vehicle
,checkpoint
列,它们代表比赛中每辆车何时在单圈中通过每个检查站。但是没有记录同一种族的某些检查站。
然后我有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.
答案 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