Внешнее слияние на фреймах данных в ключе словаря - PullRequest
1 голос
/ 15 апреля 2019

Я новичок в python и искал в Интернете решение этой проблемы, но не нашел ни одного.У меня есть словарь панелей данных панд, где ключом является «Год», а значениями - панды фреймов того года.Вот пример данных:

import pandas as pd
import numpy as np
from collections import defaultdict

##Creating Dataframes
data1_2018 =[[1,2018,80], [2,2018,70]]
data2_2018 = [[1,2018,77], [3,2018,62]]
data3_2018 = [[1,2018,82], [2,2018,88], [4,2018,66]]

data1_2017 = [[1,2017,80], [5,2017,70]]
data2_2017 = [[1,2017,77], [3,2017,62]]
data3_2017 = [[1,2017,50], [2,2017,52], [4,2017,51]]

df1_2018 = pd.DataFrame(data1_2018, columns = ['ID', 'Year', 'Score_1'])
df2_2018 = pd.DataFrame(data2_2018, columns = ['ID', 'Year', 'Score_2'])
df3_2018 = pd.DataFrame(data3_2018, columns = ['ID', 'Year', 'Score_3'])


df1_2017 = pd.DataFrame(data1_2017, columns = ['ID', 'Year', 'Score_1'])
df2_2017 = pd.DataFrame(data2_2017, columns = ['ID', 'Year', 'Score_2'])
df3_2017 = pd.DataFrame(data3_2017, columns = ['ID', 'Year', 'Score_3'])

###Creating list of all dataframes
all_df_list = [df1_2018,df2_2018,df3_2018,df1_2017,df2_2017,df3_2017]

Я решил начать со списка со всеми фреймами данных, потому что именно так данные импортируются в моей реальной проблеме.После того, как у меня есть список фреймов данных, я создал словарь этих фреймов.

yearly_dfs = defaultdict(list)
####Loop for creating dict with keys being years and values being dfs for that year
for df in all_df_list:
    for yr, yr_df in df.groupby('Year'):
        yearly_dfs[yr].append(yr_df)

Теперь мой вопрос: вы можете циклически проходить по каждой группе фреймы данных и объединять их вместе с внешним слиянием по 'ID».Желаемым результатом будет список или словарь с одним кадром данных в год.Вот как будет выглядеть желаемый результат для каждого года:

desired_output_2018 = df1_2018.merge(df2_2018, how = 'outer', on = ['ID', 'Year']).merge(df3_2018, how = 'outer', on = ['ID', 'Year']) 
desired_output_2017 = df1_2017.merge(df2_2017, how = 'outer', on = ['ID', 'Year']).merge(df3_2017, how = 'outer', on = ['ID', 'Year'])

print(desired_output_2018)
   ID  Year  Score_1  Score_2  Score_3
0   1  2018     80.0     77.0     82.0
1   2  2018     70.0      NaN     88.0
2   3  2018      NaN     62.0      NaN
3   4  2018      NaN      NaN     66.0

print(desired_output_2017)
   ID  Year  Score_1  Score_2  Score_3
0   1  2017     80.0     77.0     50.0
1   5  2017     70.0      NaN      NaN
2   3  2017      NaN     62.0      NaN
3   2  2017      NaN      NaN     52.0
4   4  2017      NaN      NaN     51.0

Любая помощь будет принята с благодарностью !!

Спасибо!

1 Ответ

1 голос
/ 15 апреля 2019

Используйте pandas.concat и DataFrame.groupby 'Year' & 'ID', с функцией agg first, затем используйте в Диктовое понимание с grouby 'Год':

df_all = (pd.concat(all_df_list, sort=False)
          .groupby(['ID', 'Year']).first().reset_index())

df_years = {yr: df for yr, df in df_all.groupby('Year')}

Доступ как:

df_years[2017]

   ID  Year  Score_1  Score_2  Score_3
0   1  2017     80.0     77.0     50.0
2   2  2017      NaN      NaN     52.0
4   3  2017      NaN     62.0      NaN
6   4  2017      NaN      NaN     51.0
8   5  2017     70.0      NaN      NaN

df_years[2018]

  ID  Year  Score_1  Score_2  Score_3
1   1  2018     80.0     77.0     82.0
3   2  2018     70.0      NaN     88.0
5   3  2018      NaN     62.0      NaN
7   4  2018      NaN      NaN     66.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...