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

У меня есть список фреймов данных, которые я хочу объединить в один фрейм данных .

Фреймы данных со списком с одинаковыми именами столбцов имеют разные индексы и наоборот.Каждый фрейм данных имеет 1 строку и 80 столбцов, а список имеет общую длину 8000 фреймов данных.

Вот уменьшенный пример моего списка фреймов данных:

import pandas as pd

u = pd.DataFrame(data=[[1, 2, '111']], columns = ['a', 'b', 'id'])
u = u.set_index('id')

v = pd.DataFrame(data=[[3, 4, '222']], columns = ['a', 'b', 'id'])
v = v.set_index('id')

w = pd.DataFrame(data=[[5, 6, '333']], columns = ['a', 'b', 'id'])
w = w.set_index('id')

x = pd.DataFrame(data=[[7, 8, '444']], columns = ['a', 'b', 'id'])
x = x.set_index('id')

y = pd.DataFrame(data=[[9, 10, '111']], columns = ['c', 'd', 'id'])
y = y.set_index('id')

z = pd.DataFrame(data=[[11, 12, '222']], columns = ['c', 'd', 'id'])
z = z.set_index('id')

list_df = [u, v, w, x, y, z]

Как я могу создать одну объединенную таблицу, которая выглядит следующим образом:

id    a     b    c    d
--------------------------
111   1.0   2.0  9.0  10.0
222   3.0   4.0  11.0 12.0
333   5.0   6.0  NaN  NaN
444   7.0   8.0  NaN  NaN

В настоящее время, из-за размера моего списка, я использую pd.concat.Однако pd.concat(list_df, axis = 0) дает:

id    a     b    c    d
--------------------------
111   1.0   2.0  NaN  NaN
222   3.0   4.0  NaN  NaN
333   5.0   6.0  NaN  NaN
444   7.0   8.0  NaN  NaN
111   NaN   NaN  9.0  10.0
222   NaN   NaN  11.0 12.0

и pd.concat(list_df, axis = 1) дает:

id    a    b    a    b    a    b    a    b    c    d    c    d
----------------------------------------------------------------
111   1.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN  9.0  10.0 NaN  NaN
222   NaN  NaN  3.0  4.0  NaN  NaN  NaN  NaN  NaN  NaN  11.0 12.0
333   NaN  NaN  NaN  NaN  5.0  6.0  NaN  NaN  NaN  NaN  NaN  NaN 
444   NaN  NaN  NaN  NaN  NaN  NaN  7.0  8.0  NaN  NaN  NaN  NaN

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Это должно сделать это:

pd.concat([u, v, w, x, y, z], sort=False).set_index('id').groupby(level=0).first()

Выход:

       a    b     c     d
id                       
111  1.0  2.0   9.0  10.0
222  3.0  4.0  11.0  12.0
333  5.0  6.0   NaN   NaN
444  7.0  8.0   NaN   NaN

Обратите внимание, вам не нужно set_index() отдельно для каждого кадра данных.

Объяснение:

Вы можете передать список фреймов данных в pd.concat() с ключевым словом sort=False, которое является новым в версии 0.23.0 для панд, так как предыдущее поведение было сортировать по умолчанию IIUC(см. документы здесь ).Затем вы можете использовать set_index('id') для установки индекса объединенного фрейма данных.Наконец, вы можете groupby(level=0) сгруппировать фрейм данных по его индексу уровня 0 ('id') и взять первое не-NaN-значение для каждой строки с помощью first().

0 голосов
/ 11 октября 2018

Хранение dfs с одинаковыми столбцами вместе и затем применение внешнего объединения

import pandas as pd

u = pd.DataFrame(data=[[1, 2, '111']], columns = ['a', 'b', 'id'])
u = u.set_index('id')

v = pd.DataFrame(data=[[3, 4, '222']], columns = ['a', 'b', 'id'])
v = v.set_index('id')

w = pd.DataFrame(data=[[5, 6, '333']], columns = ['a', 'b', 'id'])
w = w.set_index('id')

x = pd.DataFrame(data=[[7, 8, '444']], columns = ['a', 'b', 'id'])
x = x.set_index('id')

y = pd.DataFrame(data=[[9, 10, '111']], columns = ['c', 'd', 'id'])
y = y.set_index('id')

z = pd.DataFrame(data=[[11, 12, '222']], columns = ['c', 'd', 'id'])
z = z.set_index('id')

list_df = [u, v, w, x]
df=pd.concat(list_df, axis = 0)
df2=pd.concat([y,z], axis = 0)
df.join(df2, how='outer')

Вывод

    a   b   c       d
id              
111 1   2   9.0     10.0
222 3   4   11.0    12.0
333 5   6   NaN     NaN
444 7   8   NaN      NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...