Обновить значение на основе другой пары фреймов данных - PullRequest
1 голос
/ 09 июля 2020

У меня проблема, когда мне нужно обновить значение, если люди были за одной таблицей.

 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 соответственно.

, например: Джен и Джон были в таблице 1, поэтому мне нужно обновить строку в df, в котором есть Jen и John, и для них установлено значение value + 100, так что 110.

Я подумал о том, чтобы, возможно, выполнить самостоятельное соединение с meeting, чтобы формат соответствовал формату df, но не конечно, самый простой или самый быстрый способ

Ответы [ 2 ]

1 голос
/ 09 июля 2020

IIU C вы можете установить 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
0 голосов
/ 09 июля 2020

Это может быть подход с использованием 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...