温馨提示:本文翻译自stackoverflow.com,查看原文请点击:Python Pandas: reusing row value to another row - lookup across row
lookup pandas python vlookup

Python Pandas: reusing row value to another row - 跨行查找

发布于 2020-05-03 14:09:35

我有以下数据框

df1 =  DataFrame([['OBJ1', 10, 'BX', 'pool1', 'OBJ2'],['OBJ2', 0, '', '', 'OBJ1'],['OBJ3', 10, 'BY', 'pool2', 'OBJ4'],['OBJ4', 0, '', '', 'OBJ3'],['OBJ5', 10, 'BZ', 'pool3', '']], columns=['OBJ', 'value', 'conf', 'Res', 'Key'])

在此处输入图片说明

我正在尝试做的是:

  • 检查值是否为0
  • Conf and Res使用与OBJ匹配的键获取行的值
  • 例如,OBJ2的值为0,而键为OBJ 2,则其conf应该变为BX,Res变为pool1

我使用查找或其他一些帖子尝试了多种解决方案,但似乎没有任何效果。

df1.loc[df1['value']==0, 'conf'] = df1.loc[df1['OBJ']==df1['Key']]['conf'] 

失败,因为我意识到这是在用OBJ = Key查找行

查看更多

提问者
Philip Fawzy
被浏览
13
jezrael 2020-02-14 16:33

使用DataFrame.mergeleft_onright_on参数index列通过创造DataFrame.reset_index新的DataFrame,然后将其转换indexindex通过DataFrame.set_index并最终设定的新volumns DataFrame.loc

m = df1['value'].eq(0)
cols = ['conf','Res']
df = (df1.reset_index().loc[m, ['index','OBJ']]
          .merge(df1, left_on='OBJ', right_on='Key')
          .set_index('index')[cols])
print (df)
      conf    Res
index            
1       BX  pool1
3       BY  pool2

df1.loc[m, cols] = df
print (df1)
    OBJ  value conf    Res   Key
0  OBJ1     10   BX  pool1  OBJ2
1  OBJ2      0   BX  pool1  OBJ1
2  OBJ3     10   BY  pool2  OBJ4
3  OBJ4      0   BY  pool2  OBJ3
4  OBJ5     10   BZ  pool3