根据条件在数据框中查找值

时间:2019-12-12 14:50:46

标签: python pandas dataframe

我有两个数据帧-一个是主数据帧(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之外,还有其他更好的方法吗?

3 个答案:

答案 0 :(得分:3)

DataFrame.lookupBore列一起创建索引,并在必要时将列转换为整数:

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.meltDataFrame.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')