Как взять значения строк из одного pandas фрейма данных и использовать их как ссылку для получения значений из другого фрейма данных - PullRequest
2 голосов
/ 13 июля 2020

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

Пример:

data1 = {'Household_0':['1234567','2345678','3456789','4567890'],
        'Individual_0':['1111111','2222222','3333333','4444444'],
        'Individual_1':['5555555','6666666','7777777','']}
df1=pd.DataFrame(data1)

data2 = {'Constituent Id':['1234567','2345678','3456789','4567890',
                           '1111111','2222222','3333333','4444444',
                           '5555555','6666666','7777777'],
         'Display Name':['Clark Kent and Lois Lane','Bruce Banner and Betty Ross',
                         'Tony Stark and Pepper Pots','Steve Rogers','Clark Kent','Bruce Banner',
                         'Tony Stark','Steve Rogers','Lois Lane','Betty Ross','Pepper Pots']}
df2=pd.DataFrame(data2)

Результат:

df1
  Household_0 Individual_0 Individual_1
0     1234567      1111111      5555555
1     2345678      2222222      6666666
2     3456789      3333333      7777777
3     4567890      4444444     

df2
   Constituent Id                 Display Name
0         1234567     Clark Kent and Lois Lane
1         2345678  Bruce Banner and Betty Ross
2         3456789   Tony Stark and Pepper Pots
3         4567890                 Steve Rogers
4         1111111                   Clark Kent
5         2222222                 Bruce Banner
6         3333333                   Tony Stark
7         4444444                 Steve Rogers
8         5555555                    Lois Lane
9         6666666                   Betty Ross
10        7777777                  Pepper Pots

Я хотел бы возьмите df1, сделайте ссылку на Constituent Id из df2 и создайте новый фрейм данных с именами составляющих вместо их идентификаторов, чтобы мы могли убедиться, что они действительно являются членами семьи / домашнего хозяйства.

Я считаю Я могу сделать это, повторяя, но это кажется неправильным подходом. Есть ли простой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Вы можете конвейерно melt, merge и pivot_table.

df3 = (
    df1
    .reset_index()
    .melt('index')
    .merge(df2, left_on='value', right_on='Constituent Id')
    .pivot_table(values='Display Name', index='index', columns='variable', aggfunc='last')
)
print(df3)

выходы

variable                  Household_0  Individual_0 Individual_1
index                                                           
0            Clark Kent and Lois Lane    Clark Kent    Lois Lane
1         Bruce Banner and Betty Ross  Bruce Banner   Betty Ross
2          Tony Stark and Pepper Pots    Tony Stark  Pepper Pots
3                        Steve Rogers  Steve Rogers          NaN
2 голосов
/ 13 июля 2020

вы можете map каждый столбец из df1 с серией, основанной на df2 один раз set_index Идентификатор компонента и выбрать отображаемое имя столбца. Используйте apply, чтобы повторить операцию для каждого столбца.

print (df1.apply(lambda x: x.map(df2.set_index('Constituent Id')['Display Name'])))
                   Household_0  Individual_0 Individual_1
0     Clark Kent and Lois Lane    Clark Kent    Lois Lane
1  Bruce Banner and Betty Ross  Bruce Banner   Betty Ross
2   Tony Stark and Pepper Pots    Tony Stark  Pepper Pots
3                 Steve Rogers  Steve Rogers          NaN
0 голосов
/ 13 июля 2020

Вы также можете попробовать использовать .applymap(), чтобы связать их вместе.

reference = df2.set_index('Constituent Id')['Display Name'].to_dict()
df1[df1.columns] = df1[df1.columns].applymap(reference.get)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...