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

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

Минимальный воспроизводимый:

df1 = pd.DataFrame({'Constituent Id':['111111','222222','333333','444444','555555','666666','777777'],
               'Type':['Individual','Household','Individual','Household',
                       'Individual','Individual','Individual'],
               'Name':['Panda Smith','Panda and Python','Python Jones','Postgres Family',
                       'Paul Postgres','Mary Postgres','Sqlite Postgres']})

df2 = pd.DataFrame({'Account_ID':['ABCDEF','GHIJKL'],
                    'Household_0':['222222','444444'],
                    'Individual_0':['111111','555555'],
                    'Individual_1':['333333','666666'],
                    'Individual_2':['','777777']})

Результат:

 >>> df1
      Constituent Id        Type              Name
    0         111111  Individual       Panda Smith
    1         222222   Household  Panda and Python
    2         333333  Individual      Python Jones
    3         444444   Household   Postgres Family
    4         555555  Individual     Paul Postgres
    5         666666  Individual     Mary Postgres
    6         777777  Individual   Sqlite Postgres
>>> df2
      Account_ID Household_0 Individual_0 Individual_1 Individual_2
    0     ABCDEF      222222       111111       333333             
    1     GHIJKL      444444       555555       666666       777777

Что я хочу сделать, так это добавить столбец к df1 с Account_ID, который применяется к каждому из лиц в учетной записи. Домохозяйства не нужны, но нормально, если я их включу.

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

В моем примере результат будет выглядеть так:

  Constituent Id        Type              Name   Account_ID  
0         111111  Individual       Panda Smith      ABCDEF
1         222222   Household  Panda and Python      ABCDEF
2         333333  Individual      Python Jones      ABCDEF
3         444444   Household   Postgres Family      GHIJKL
4         555555  Individual     Paul Postgres      GHIJKL
5         666666  Individual     Mary Postgres      GHIJKL
6         777777  Individual   Sqlite Postgres      GHIJKL

1 Ответ

2 голосов
/ 19 июня 2020

IIU C нужно melt тогда merge

Если. Type не требуется, вы можете опустить его во второй строке и в предложении слияния.

s = pd.melt(df2,id_vars='Account_ID',var_name='Type',value_name='Constituent Id')
s['Type'] = s['Type'].str.split('_',expand=True)[0]

print(s.head(5))
  Account_ID        Type Constituent Id
0     ABCDEF   Household         222222
1     GHIJKL   Household         444444
2     ABCDEF  Individual         111111
3     GHIJKL  Individual         555555
4     ABCDEF  Individual         333333

df3 = pd.merge(df1,
         s,
         on=['Type','Constituent Id'],
         how='left'
        )

print(df3)

  Constituent Id        Type              Name Account_ID
0         111111  Individual       Panda Smith     ABCDEF
1         222222   Household  Panda and Python     ABCDEF
2         333333  Individual      Python Jones     ABCDEF
3         444444   Household   Postgres Family     GHIJKL
4         555555  Individual     Paul Postgres     GHIJKL
5         666666  Individual     Mary Postgres     GHIJKL
6         777777  Individual   Sqlite Postgres     GHIJKL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...