根据另一个数据框配对更新值

时间:2020-07-09 10:59:25

标签: python pandas

如果人们在同一张桌子上,我需要更新一个值。

 import pandas as pd
data = {"p1":['Jen','Mark','Carrie'],
       "p2":['John','Jason','Rob'],
       "value":[10,20,40]}
df = pd.DataFrame(data,columns=["p1",'p2','value'])

meeting = {'person':['Jen','Mark','Carrie','John','Jason','Rob'],
          'table':[1,2,3,1,2,3]}
meeting = pd.DataFrame(meeting,columns=['person','table'])

df是一个关系表,value是我需要更新的字段。因此,如果两个人位于meeting数据框中的同一张桌子上,则相应地更新df行。

例如:Jen和John都在表1上,因此我需要更新df中具有Jen和John的行,并将其值设置为value + 100,所以为110。

我考虑过可能在meeting上进行自我联接以使格式与df匹配,但是不确定这是最简单还是最快的方法

2 个答案:

答案 0 :(得分:1)

IIUC,您可以将person设置为meeting数据帧中的索引,并使用其表值替换names中的df。然后,如果两个映射具有相同的值(表),则替换为df.value+100

m = df[['p1','p2']].replace(meeting.set_index('person').table).eval('p1==p2')
df['value'] = df.value.mask(m, df.value+100)

print(df)

       p1     p2  value
0     Jen   John    110
1    Mark  Jason    120
2  Carrie    Rob    140

答案 1 :(得分:0)

这可能是一种使用df.to_records()的方法:

groups=meeting.groupby('table').agg(set)['person'].to_list()
df['value']=[row[-1]+100  if set(list(row)[1:3]) in groups else row[-1] for row in df.to_records()]

输出:

df
       p1     p2  value
0     Jen   John    110
1    Mark  Jason    120
2  Carrie    Rob    140