1

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

 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,所以我需要更新dfJen 和 John 所在的行,并将它们的值设置为value + 100110。

我想也许做一个自我加入meeting来获得与格式匹配的格式,df但不确定这是否是最简单或最快的方法

4

2 回答 2

1

IIUC 您可以person在数据框中设置 as 索引meeting,并使用其表值替换namesin 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
于 2020-07-09T11:08:06.813 回答
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
于 2020-07-09T11:24:40.313 回答