Этот вопрос было очень сложно говорить.
Вот пример кода для воспроизводимого примера:
import numpy as np
import pandas as pd
df1 = pd.DataFrame([['a', 1, 10, 1], ['a', 2, 20, 1], ['b', 1, 4, 1], ['c', 1, 2, 1], ['e', 2, 10, 1]])
df2 = pd.DataFrame([['a', 1, 15, 2], ['a', 2, 20, 2], ['c', 1, 2, 2]])
df3 = pd.DataFrame([['d', 1, 10, 3], ['e', 2, 20, 3], ['f', 1, 15, 3]])
df1.columns = ['name', 'id', 'price', 'part']
df2.columns = ['name', 'id', 'price', 'part']
df3.columns = ['name', 'id', 'price', 'part']
result = pd.DataFrame([['a', 1, 10, 15, 'missing'],
['a', 2, 20, 20, 'missing'],
['b', 1, 4, 'missing', 'missing'],
['c', 1, 2, 2, 'missing'],
['e', 2, 10, 'missing', 20],
['d', 1, 'missing', 'missing', 10],
['f', 1, 'missing', 'missing', 15]])
result.columns = ['name', 'id', 'pricepart1', 'pricepart2', 'pricepart3']
Итак, есть три DataFrames:
df1
name id price part
0 a 1 10 1
1 a 2 20 1
2 b 1 4 1
3 c 1 2 1
4 e 2 10 1
df2
name id price part
0 a 1 15 2
1 a 2 20 2
2 c 1 2 2
df3
name id price part
0 d 1 10 3
1 e 2 20 3
2 f 1 15 3
name
и id
похожи на составной. Он может присутствовать во всех трех DataFrames, всего два из трех DataFrames, всего в 1 из DataFrames. Для представления которых DataFrame на name, id
пришел, part
колонки существует в df1
, df2
и df3
.
Результат, который я ищу, определяется result
DataFrame.
name id pricepart1 pricepart2 pricepart3
0 a 1 10 15 missing
1 a 2 20 20 missing
2 b 1 4 missing missing
3 c 1 2 2 missing
4 e 2 10 missing 20
5 d 1 missing missing 10
6 f 1 missing missing 15
В принципе, я хочу, чтобы name
EVERY, id
было учтено. Даже если ИДЕННОЕ name
, id
приходит как в df1
и в df2
, я хочу, чтобы отдельные столбцы по price
от каждой part
даже если цены в обеих частях /DataFrames одинаковы.
В results
DataFrame возьмите row1, a 1 10 15 missing
То, что это представляет, - это name, id
пара name, id
a 1
имеет цену 10
в df1
, 15
в df2
и missing
в df3
.
Если значение строки missing
для определенного pricepart
это означает, что name, id
пара name, id
не отображались в этом конкретном DataFrame!
Я использовал part
для представления DataFrame! так что вы можете asusme, что эта part
ВСЕГДА 1
в df1
, ВСЕГДА 2
в df2
и ВСЕГДА 3
в df3
.
До сих пор.. Я буквально только что сделал, pd.concat([df1, df2, df3])
Не уверен, что этот подход приведет к тупику.
Имейте в виду, что исходными тремя DataFrames являются 62245 rows × 4 columns
EACH. И каждый DataFrame может содержать или не содержать name
, пару id
. Если name
, пара id
присутствует в EVEN 1 DataFrames, а не другие, я хотел бы, чтобы это было учтено с missing
для других DataFrames.
Вы можете использовать pd.merge
, используя < how='outer'
pd.merge
how='outer'
# Change column names and remove 'part' column
df1 = df1.rename(columns={'price':'pricepart1'}).drop('part', axis=1)
df2 = df2.rename(columns={'price':'pricepart2'}).drop('part', axis=1)
df3 = df3.rename(columns={'price':'pricepart3'}).drop('part', axis=1)
# Merge dataframes
df = pd.merge(df1, df2, left_on=['name', 'id'], right_on=['name', 'id'], how='outer')
df = pd.merge(df , df3, left_on=['name', 'id'], right_on=['name', 'id'], how='outer')
# Fill na values with 'missing'
df = df.fillna('missing')
Out[]:
name id pricepart1 pricepart2 pricepart3
0 a 1 10 15 missing
1 a 2 20 20 missing
2 b 1 4 missing missing
3 c 1 2 2 missing
4 e 2 10 missing 20
5 d 1 missing missing 10
6 f 1 missing missing 15