从其他数据框中按行查找

时间:2018-07-02 15:57:40

标签: python pandas

我有两个要根据特定条件合并的数据帧。这是第一个数据帧,每行代表一个错误(因此ID多次出现):

df1

  ID  Count  Publication
0  A     10         1990
1  B     15         1990
2  A     17         1990
3  B     19         1991
4  A     13         1991

这是第二个数据帧。在这里,每个ID仅显示一次,但随着时间的推移(此处为1990年至1993年)。

df2

  ID  1990  1991  1992  1993
0  A   1.1   1.2   1.3   1.4
1  B   2.3   2.4   2.4   2.6
2  C   3.4   3.5   3.6   3.7
3  D   4.5   4.6   4.7   4.8

我的目标是在df1中添加一个结果列,在其中将df1 [“ Count”]列中的值乘以df2中的相应值(“ ID年”对),例如第一行:“ 1990”中的“ ID” A是1.1乘以“ Count” 10 = 11。

results

  ID  Count  Publication  Results
0  A     10         1990     11.0
1  B     15         1990     34.5
2  A     17         1990     18.7
3  B     19         1991     45.6
4  A     13         1991     15.6

到目前为止,我已经使用pandas .apply()函数尝试了多个选项,但是没有用。我也曾尝试根据ID .merge()从df2到df1的列,但此后我仍然无法进行计算(我希望这可以简化问题)。

问题:是否有一种简单有效的方法来逐行遍历df1并从df2中“拾取”相应的值进行计算?

2 个答案:

答案 0 :(得分:3)

使用lookup

df2.set_index('ID').lookup(df1.ID,df1.Publication.astype(str))
Out[189]: array([1.1, 2.3, 1.1, 2.4, 1.2])

df1['Results']=df2.set_index('ID').lookup(df1.ID,df1.Publication.astype(str))*(df1.Count)
df1
Out[194]: 
  ID  Count  Publication  Results
0  A     10         1990     11.0
1  B     15         1990     34.5
2  A     17         1990     18.7
3  B     19         1991     45.6
4  A     13         1991     15.6

答案 1 :(得分:1)

我真的不知道它的效率如何,但是您可以做到:

df1 = df1.set_index(['ID', 'Publication'])
df2 = df2.set_index('ID').stack()
df2.index.rename(['ID', 'Publication'], inplace=True)
df1['df2_value'] = df2
df1['result'] = df1['Count'] * df1['df2_value']