Объединить специфицированный c столбец в нескольких фреймах данных с различной длиной - PullRequest
0 голосов
/ 12 февраля 2020

df1

    Color   date
0   A       2011
1   B       201411
2   C       20151231
3   A       2019

df2

    Color   date
0   A       2013
1   B       20151111
2   C       201101

df3

    Color   date
0   A       2011
1   B       201411
2   C       20151231
3   A       2019
4   Y       20070212

Предполагая, что есть три кадра данных: я хочу создать новый кадр данных, извлекая только столбец 'date'.

выведите то, что я хочу

Новый df

    df1-date  df2-date  df3-date     
0   2011      2013      2011
1   201411    20151111  201411
2   20151231  201101    20151231
3   2019      NaN       2019
4   NaN       NaN       20070212

Я хочу установить пустую часть на NaN, потому что длина отличается.

Я пытаюсь объединить, concat, но получаю ошибку ..

Спасибо Вы за чтение.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Еще один подход

df1.join(df2['date'],rsuffix='df2',how='outer').join(df3['date'],rsuffix='df3',how='outer')

Вывод

  Color     date        datedf2     datedf3
0   A       2011.0      2013.0      2011
1   B       201411.0    20151111.0  201411
2   C       20151231.0  201101.0    20151231
3   A       2019.0      NaN         2019
4   NaN     NaN         NaN         20070212
1 голос
/ 12 февраля 2020

Это включает в себя две проблемы, 1 несколько фреймов данных merge, 2 слияния дублированных ключей

def multikey(x): 
    return x.assign(key=x.groupby('Color').cumcount())

#we use groupby and cumcount create the addtional key

from functools import reduce

#then use reduce

df = reduce(lambda left,right: 
            pd.merge(left,right,on=['Color','key'],how='outer'), 
            list(map(multikey, [df1,df2,df3])))
df
  Color      date_x  key      date_y      date
0     A      2011.0    0      2013.0      2011
1     B    201411.0    0  20151111.0    201411
2     C  20151231.0    0    201101.0  20151231
3     A      2019.0    1         NaN      2019
4     Y         NaN    0         NaN  20070212

Обратите внимание, здесь имя, которое мы всегда можем изменить, rename

Метод 2 из cancat не считайте ключ одним слиянием с индексом

s=pd.concat([df1,df2,df3],keys=['df1','df2','df3'], axis=1)
s.columns=s.columns.map('_'.join)
s=s.filter(like='_date')
s
     df1_date    df2_date  df3_date
0      2011.0      2013.0      2011
1    201411.0  20151111.0    201411
2  20151231.0    201101.0  20151231
3      2019.0         NaN      2019
4         NaN         NaN  20070212
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...