Ищет наличие составного ключа в трех DataFrames и соответственно объединяет DataFrames

1

Этот вопрос было очень сложно говорить.

Вот пример кода для воспроизводимого примера:

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.

Теги:
pandas
dataframe
join
merge

1 ответ

2
Лучший ответ

Вы можете использовать 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
  • 0
    Я явно НЕ сообразительный ... Если постановка проблемы ДАЖЕ НЕМНОГО извращена .. Я вынужден приехать сюда .. Спасибо, приятель!
  • 0
    @Abhishek Ну, ты умеешь писать подробные вопросы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню