Объединение неравного фрейма данных со всеми значениями - PullRequest
1 голос
/ 09 апреля 2019

Я хочу объединить два фрейма данных с неравной длиной с некоторыми условиями. Детали фреймов данных:

  1. Фрейм данных A содержит около 1000 строк
  2. Фрейм данных B содержит около 50 строк

Поля в обоих фреймах данных похожи в A:

A_Name, A_count, A_Normalised value, A_year

кадр данных A:

print (df1)
   A_Organisation  A_count  A_Normalised  A_Year
0             ABC      654         34545    2018
1             DEF      565         54564    2018
2             GHI      565         34546    2018
3             QWE      790          3945    2018
4             DSO      788          1561    2017
5             DFB    34579           546    2017
6             HHS       56         31651    2017
7            FDGH       98           156    2016
8            DSFH    51651        153156    2016
9            KBIU      151          1561    2015
10            SDF      165          6513    2015

Для кадра данных B:

B_Name, B_count, B_Normalised value, B_year

print (df2)
  B_Organisation  B_count  B_Normalised  B_Year
0            MNO      123           432    2018
1            MNO      133           234    2018
2            MNO     8743           484    2017
3            MNO     1335          1512    2015
4            MNO      456          3454    2014
5            MNO      345           234    2014

Теперь я хочу объединить оба фрейма данных на основе года, но я не хочу дублировать значения. то есть, если в Dataframe A, скажем, для 2018 года, содержится 50 значений, а в Dataframe B для 2018 года содержится 5 значений. Тогда общее количество строк в 2018 году должно быть 50, а результат должен быть таким:

enter image description here

1 Ответ

0 голосов
/ 09 апреля 2019

Используйте GroupBy.cumcount для столбцов счетчика, затем DataFrame.merge со столбцами rename для столбцов избегания с одинаковым содержанием A_Year и B_Year, если используются параметры left_on и right_on in merge:

df1['g'] = df1.groupby('A_Year').cumcount()
df2['g'] = df2.groupby('B_Year').cumcount()

df = (df1.rename(columns={'A_Year':'Year'})
         .merge(df2.rename(columns={'B_Year':'Year'}), on=['Year','g'], how='outer')
         .drop('g', axis=1))

print (df)
   A_Organisation  A_count  A_Normalised  Year B_Organisation  B_count  \
0             ABC    654.0       34545.0  2018            MNO    123.0   
1             DEF    565.0       54564.0  2018            MNO    133.0   
2             GHI    565.0       34546.0  2018            NaN      NaN   
3             QWE    790.0        3945.0  2018            NaN      NaN   
4             DSO    788.0        1561.0  2017            MNO   8743.0   
5             DFB  34579.0         546.0  2017            NaN      NaN   
6             HHS     56.0       31651.0  2017            NaN      NaN   
7            FDGH     98.0         156.0  2016            NaN      NaN   
8            DSFH  51651.0      153156.0  2016            NaN      NaN   
9            KBIU    151.0        1561.0  2015            MNO   1335.0   
10            SDF    165.0        6513.0  2015            NaN      NaN   
11            NaN      NaN           NaN  2014            MNO    456.0   
12            NaN      NaN           NaN  2014            MNO    345.0   

    B_Normalised  
0          432.0  
1          234.0  
2            NaN  
3            NaN  
4          484.0  
5            NaN  
6            NaN  
7            NaN  
8            NaN  
9         1512.0  
10           NaN  
11        3454.0  
12         234.0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...