Преобразование Pandas DataFrames с разными столбцами в повторяемый и преобразование в один DataFrame

Как я могу преобразовать три DataFrames a,b,c ниже в один DF со столбцами A,B,C,D?

Я специально хочу собрать несколько DataFrames в одну итерацию (dict / list of dicts), прежде чем воссоздавать их как один DF, а не добавлять или объединять их.

Моя попытка:

a=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
b=pd.DataFrame({'A':[7,8,9],'B':[10,11,12]})
c=pd.DataFrame({'B':[13,14,15],'C':[16,17,18],'D':[19,20,21]})

list_of_dicts=[] #can be list of lists/dicts 

for i in [a, b, c]:
    x=i.to_dict('split')
    list_of_dicts.append(x)

pd.DataFrame.from_records(list_of_dicts)

# Решено ниже. Кредит Эрику Труетту.

import pandas as pd
import itertools

a=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
b=pd.DataFrame({'A':[7,8,9],'B':[10,11,12]})
c=pd.DataFrame({'B':[13,14,15],'C':[16,17,18]})

list_of_dicts=[]

for i in [a, b, c]:
    x=i.to_dict('records')
    list_of_dicts.append(x)

pd.DataFrame.from_records(list(itertools.chain.from_iterable(list_of_dicts)))

Метод to_dict фрейма данных создаст список dicts, если вы используете параметр records. Тогда вам просто нужно будет сложить три преобразованных фрейма данных вместе, чтобы составить один список, или вы можете использовать itertools.chain.from_iterable.

Eric Truett 05.04.2021 05:33

Ты сделал это. Очень признателен

Kdog 05.04.2021 05:39

@Kdog Итак, теперь это решено? Если это так, рассмотрите возможность публикации рабочего кода в качестве ответа для будущих гуглеров.

tdy 05.04.2021 05:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
48
3

Ответы 3

Чтобы создать единый фрейм данных из этих трех, вы можете использовать функцию concat() в пандах:

a=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
b=pd.DataFrame({'A':[7,8,9],'B':[10,11,12]})
c=pd.DataFrame({'B':[13,14,15],'C':[16,17,18],'D':[19,20,21]})

d = pd.concat([a, b, c])
print(d)

дам тебе:

     A   B     C     D
0  1.0   4   NaN   NaN
1  2.0   5   NaN   NaN
2  3.0   6   NaN   NaN
0  7.0  10   NaN   NaN
1  8.0  11   NaN   NaN
2  9.0  12   NaN   NaN
0  NaN  13  16.0  19.0
1  NaN  14  17.0  20.0
2  NaN  15  18.0  21.0

Я думаю, вы можете использовать функцию append для добавления нескольких объектов DataFrame. В приведенном ниже коде я инициализирую переменную s, которая будет использоваться для объединения всех a, b, cDataFrame.

import pandas as pd

a=pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})
b=pd.DataFrame({'A':[7,8,9],'B':[10,11,12]})
c=pd.DataFrame({'B':[13,14,15],'C':[16,17,18],'D':[19,20,21]})

list_of_dicts=[] #can be list of lists/dicts 

s = pd.DataFrame()
for i in [a, b, c]:
    s = s.append(i)

print(s)

Печать s даст следующий результат

     A   B     C     D
0  1.0   4   NaN   NaN
1  2.0   5   NaN   NaN
2  3.0   6   NaN   NaN
0  7.0  10   NaN   NaN
1  8.0  11   NaN   NaN
2  9.0  12   NaN   NaN
0  NaN  13  16.0  19.0
1  NaN  14  17.0  20.0
2  NaN  15  18.0  21.0

Что-то вроде этого должно работать, чтобы построить один dict из ваших 3 DataFrames.

import pandas as pd

a = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
b = pd.DataFrame({'A': [7, 8, 9], 'B': [10, 11, 12]})
c = pd.DataFrame({'B': [13, 14, 15], 'C': [16, 17, 18], 'D': [19, 20, 21]})

dfs = [a, b, c]
list_of_records = [record for records in [i.to_dict('records') for i in dfs] for record in records]

merged_records = {
    k: [d.get(k) for d in list_of_records]
    for k in set().union(*list_of_records)
}
print(merged_records)

out = pd.DataFrame().from_records(merged_records)
print(out)

Другие вопросы по теме