我有两个数据帧-一个是主数据帧(main_df),另一个是查找数据帧(lookup_df)。我需要在主数据框中使用两个条件来在查找数据框中查找值。我的数据如下:
main_df
Bore Temperature
4 200
0.75 500
6 200
2 400
3 200
0.75 300
lookup_df
Bore 200 300 400 500
0.5 0.5 0.5 0.5 0.5
0.75 0.5 0.5 0.5 0.5
1 0.5 0.5 0.5 0.5
2 0.5 0.5 0.5 1.0
3 0.5 0.5 1.0 1.0
4 0.5 1.0 1.0 1.0
6 1.0 1.0 1.0 1.0
我的目标是在main_df中创建一个具有已查找值的新列。
最终main_df
Bore Temperature Value
4 200 0.5
0.75 500 0.5
6 200 1.0
2 400 0.5
3 200 0.5
0.75 300 0.5
我尝试通过各种迭代使用pd.merge,但似乎无法使其正常工作。除了pd.merge之外,还有其他更好的方法吗?
答案 0 :(得分:3)
将DataFrame.lookup
与Bore
列一起创建索引,并在必要时将列转换为整数:
df['Value'] = (lookup_df.set_index('Bore').rename(columns=int)
.lookup(df['Bore'], df['Temperature']))
print (df)
Bore Temperature Value
0 4.00 200 0.5
1 0.75 500 0.5
2 6.00 200 1.0
3 2.00 400 0.5
4 3.00 200 0.5
5 0.75 300 0.5
如果可能缺少某些值,那么第一个解决方案可能失败,可以将DataFrame.melt
与DataFrame.merge
一起使用,如果值是{{1之后的assign
列中的整数,则可以随意删除Temperature
}}:
melt
答案 1 :(得分:1)
这是使用列表理解的另一种方法:
main_df['value'] = [lookup.loc[lookup['Bore'] == x, str(y)].values[0]
for x,y in zip(main_df['Bore'], main_df['Temperature'])]
答案 2 :(得分:0)
您可以按Bore + Temperature进行堆叠和合并:
main_df = main_df.merge(df_lookup.stack().reset_index().set_axis(['Bore', 'Temperature', 'Value'], axis=1, inplace=False), on=['Bore', 'Temperature'], how='left')