联接不起作用。示例数据和代码如下。
查找文件:
helper time Loc FUEL Rep KM
0.1|A100|A 0.1 A100 100.00% -3.93 659
0.1|A200|A 0.1 A200 100.00% -4.49 628
0.22|A100|B 0.22 A100 90.00% -1.49 511
...
导入查找文件后,执行以下命令删除所有空格,因为之前有一个键错误。我猜可能是列中有一些空格问题。
dflookup.columns = dflookup.columns.to_series().apply(lambda x: x.strip())
这里的主文件:
time user loc dist flightKM loc2 helper1
0.1 PilotL1 A100 A 140 A200 0.1|A200|A
0.22 PilotL2 B100 B 230 A100 0.22|A100|B
...
期望主df的输出
time user loc dist flightKM loc2 helper1 Rep2 FUEL2
0.1 PilotL1 A100 A 140 A200 0.1|A200|A -3.93 100%
0.22 PilotL2 B100 B 230 A100 0.22|A100|B -1.49 90%
...
已尝试SO中提供的一些解决方案。尚未获得修复。目标:使用左、右连接上的辅助列进行匹配,以将两列(Rep、Fuel)从查找添加到dfmain中。
- 问题:**想要一些提示来解决左,连接问题,因为它没有找到所有和正确的值从查找"Rep,FEUL"到dfmain。打开一个快速修复以及提示,以优化代码无论如何,因为这只是一个基本的py脚本与可能的特殊操作。
代码:
dfmain['Loc'] = dfmain['Loc'].str.replace(' ', '')
#creating a helper1 column in dfmain by concat columns as left,
right joins didnot allow a multi column in join operator
dfmain['helper1'] = dfmain[['time', 'loc2', 'dist']].apply(
lambda x: '|'.join(x.dropna().astype(str)),
axis=1
)
#search merge
dfmain = pd.merge(
left=dfmain,
right=dflookup[['helper', 'Rep', 'FUEL']],
left_on='helper1',
right_on='helper',
how='left')
#tidy up
dfmain.rename(columns={'Rep':'Rep2'}, inplace=True)
dfmain.rename(columns={'FUEL':'FUEL2'}, inplace=True)
big_df = big_df.drop(columns=['helper'])
为便于审查:
print("minimum reproducible code and dataset")
dflookup = pd.DataFrame([('falcon', 'bird', 100),
('parrot', 'bird', 50),
('lion', 'mammal', 50),
('monkey', 'mammal', 100)],
columns=['type', 'class', 'years'],
index=[0, 2, 3, 1])
dfmain = pd.DataFrame([('Target','falcon', 'bird', 389.0),
('Shout','parrot', 'bird', 24.0),
('Roar','lion', 'mammal', 80.5),
('Jump','monkey','mammal', np.nan),
('Sing','parrot','bird', 72.0)],
columns=['name','type', 'class', 'max_speed'],
index=[0, 2, 3, 1, 2])
1条答案
按热度按时间u59ebvdq1#
现在找到了一个/解决方案。如果其他人在python开始的时候可能会面临这个问题。
问题:显然
dist
列只有一个空格,这使得helper1
连接标识符返回false。最糟糕的是,由于未知/不确定的原因,以下命令没有执行任何操作来从原始列
dist
中删除此空间。因此,必须在创建
helper1
之前使用以下命令执行列独占空间删除。如果有人知道为什么第一行使用.apply(lambda)...没有像预期的那样删除空格,请在这里作为答案或注解告诉我。