Быстрая замена информации в фрейме данных Pandas с использованием других фреймов данных и серий - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я пытаюсь заменить информацию о фрейме данных, используя другой фрейм данных и серию, для моего анализа моделирования.

Пример игрушки следующий:

A - это фрейм информации о пользователе, B - этоинформационный фрейм информации об услуге, а C - это последовательная информация о том, изменил ли пользователь услугу.

TableA (user's current service info):
        cost   location
John    100    Tokyo
Tom     50     Seoul
Andy    50     Seoul
Mark    80     Seoul

TableB (service info):
             cost    location
premium_T    100     Tokyo
basic_T      60      Tokyo
premium_S    80      Seoul
basic_S      50      Seoul

Table C (service change info):
        change        
John    no  
Tom     no     
Andy    premium_S      
Mark    basic_S  

, используя приведенные выше данные, я хотел бы изменить информацию в таблице A, используя данные в таблицах B и C. Другими словами, я хочу:

TableA' (modified user's service info):
        cost   location
John    100    Tokyo
Tom     50     Seoul
Andy    80     Seoul
Mark    50     Seoul

КодЯ использовал:

TableA = pd.DataFrame(index = ['John', 'Tom', 'Andy', 'Mark'], 
                      data = {'cost': [100,50,50,80],
                     'location': ['Tokyo', 'Seoul', 'Seoul', 'Seoul']})

TableB = pd.DataFrame(index = ['premium_T', 'basic_T', 'premium_S', 'basic_S'],
                      data = {'cost': [100, 60, 80, 50],
                     'location': ['Tokyo','Tokyo','Seoul','Seoul']})  

TableC = pd.Series( ['no', 'no', 'premium_S', 'basic_S'], index = ['John', 'Tom', 'Andy', 'Mark'])

customer_list = TableA.index.tolist()

for k in customer_list:
    if TableC.loc[k] != 'no':
        TableA.loc[k] = TableB.loc[TableC.loc[k]] 

Код работает и предоставляет результаты, которые я желаю.

Однако мне приходится многократно выполнять такую ​​работу для очень большого набора данных, и мне нужно быстрееспособ сделать такие замены.

Есть идеи?Я думаю, что повторное использование .loc является проблемой, но я еще не нашел вероятного решения.Я посмотрел на pd.update () или pd.replace (), но, похоже, это не то, что я ищу.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Сначала рассчитайте клиентов в области из TableC, используя reindex и логическое индексирование:

idx = TableC.reindex(TableA.index & TableC.index)
idx = idx[idx != 'no']

Затем обновите TableA через loc:

TableA.loc[np.in1d(TableA.index, idx.index)] = TableB.reindex(idx.values).values

Результат:

       cost location
John  100.0    Tokyo
Tom    50.0    Seoul
Andy   80.0    Seoul
Mark   50.0    Seoul
0 голосов
/ 07 сентября 2018

Если мы преобразуем все в кадры данных с именованными столбцами, мы можем использовать слияния для получения правильной информации:

TableA = TableA.reset_index().rename({'index': 'person'}, axis='columns')
TableB = TableB.reset_index().rename({'index': 'cost_plan'}, axis='columns')
TableC = TableC.to_frame(name='cost_plan').reset_index().rename({'index': 'person'}, axis='columns')

new_costs = TableA.merge(TableC, how='left').merge(TableB, how='left',
                                                   on=['location', 'cost_plan'],
                                                   suffixes=['_old', '_new'])

new_costs['cost_new'].fillna(new_costs['cost_old'], inplace=True)

new_costs тогда выглядит так:

  person  cost_old location  cost_plan  cost_new
0   John       100    Tokyo         no     100.0
1    Tom        50    Seoul         no      50.0
2   Andy        50    Seoul  premium_S      80.0
3   Mark        80    Seoul    basic_S      50.0
...