如果人们在同一张桌子上,我需要更新一个值。
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
匹配,但是不确定这是最简单还是最快的方法
答案 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