Pandas DataFrames объединяет повторяет значения, чтобы выровнять - PullRequest
0 голосов
/ 02 марта 2019

Вот ссылка на исходный источник набора данных: набор данных для емкости и набор данных для типа

или модифицированная версия набор данных изменен1 и набор данных изменен2

Мне нужно объединить 2 кадра данных:

  first_df=pd.DataFrame([['2001','Abu Dhabi','100-','462'],['2001','Abu Dhabi','100','44'],['2001','Abu Dhabi','200','462'],['2001','Dubai','100-','40'],['2001','Dubai','100','30'],['2001','Dubai','200','51'],['2002','Abu Dhabi','100-','300'],['2002','Abu Dhabi','100','220'],['2002','Abu Dhabi','200','56'],['2002','Dubai','100-','55'],['2002','Dubai','100','67'],['2002','Dubai','200','89']],columns=['Year','Emirate','Capacity','Number'])

  second_df=pd.DataFrame([['2001','Abu Dhabi','Performed','45'],['2001','Abu Dhabi','Not Performed','76'],['2001','Dubai','Performed','90'],['2001','Dubai','Not Performed','50'],['2002','Abu Dhabi','Performed','78'],['2002','Abu Dhabi','Not Performed','45'],['2002','Dubai','Performed','76'],['2002','Dubai','Not Performed','58']],columns=['Year','Emirate','Type','Value'])

, поэтому я установил multiIndex для обоих кадров данных:

first=first_df.set_index(['Year','Emirate'])
second=second_df.set_index(['Year','Emirate'])

и объединил:

merged=first.merge(second,how='outer',right_index=True,left_index=True)

со следующим результатом:

Объединены

| Year , Emirate | Capacity | count | friday | count | |:----------------------|:-----------|--------:|:--------------|--------:| | ('2001', 'Abu Dhabi') | 100- | 462 | Performed | 45 | | ('2001', 'Abu Dhabi') | 100- | 462 | Not Performed | 76 | | ('2001', 'Abu Dhabi') | 100 | 44 | Performed | 45 | | ('2001', 'Abu Dhabi') | 100 | 44 | Not Performed | 76 | | ('2001', 'Abu Dhabi') | 200 | 657 | Performed | 45 | | ('2001', 'Abu Dhabi') | 200 | 657 | Not Performed | 76 | | ('2001', 'Dubai') | 100- | 40 | Performed | 90 | | ('2001', 'Dubai') | 100- | 40 | Not Performed | 50 | | ('2001', 'Dubai') | 100 | 30 | Performed | 90 | | ('2001', 'Dubai') | 100 | 30 | Not Performed | 50 | | ('2001', 'Dubai') | 200 | 51 | Performed | 90 | | ('2001', 'Dubai') | 200 | 51 | Not Performed | 50 | | ('2002', 'Abu Dhabi') | 100- | 300 | Performed | 78 | | ('2002', 'Abu Dhabi') | 100- | 300 | Not Performed | 45 | | ('2002', 'Abu Dhabi') | 100 | 220 | Performed | 78 | | ('2002', 'Abu Dhabi') | 100 | 220 | Not Performed | 45 | | ('2002', 'Abu Dhabi') | 200 | 56 | Performed | 78 | | ('2002', 'Abu Dhabi') | 200 | 56 | Not Performed | 45 | | ('2002', 'Dubai') | 100- | 55 | Performed | 76 | | ('2002', 'Dubai') | 100- | 55 | Not Performed | 58 | | ('2002', 'Dubai') | 100 | 67 | Performed | 76 | | ('2002', 'Dubai') | 100 | 67 | Not Performed | 58 | | ('2002', 'Dubai') | 200 | 89 | Performed | 76 | | ('2002', 'Dubai') | 200 | 89 | Not Performed | 58 |

и попытались выполнить констатацию со следующим результатом:

joined=pd.concat([first,second])

JOINED

| Year , Emirate | Capacity | Number | Type | Value | |:----------------------|:-----------|---------:|:--------------|--------:| | ('2001', 'Abu Dhabi') | 100- | 462 | nan | nan | | ('2001', 'Abu Dhabi') | 100 | 44 | nan | nan | | ('2001', 'Abu Dhabi') | 200 | 657 | nan | nan | | ('2001', 'Dubai') | 100- | 40 | nan | nan | | ('2001', 'Dubai') | 100 | 30 | nan | nan | | ('2001', 'Dubai') | 200 | 51 | nan | nan | | ('2002', 'Abu Dhabi') | 100- | 300 | nan | nan | | ('2002', 'Abu Dhabi') | 100 | 220 | nan | nan | | ('2002', 'Abu Dhabi') | 200 | 56 | nan | nan | | ('2002', 'Dubai') | 100- | 55 | nan | nan | | ('2002', 'Dubai') | 100 | 67 | nan | nan | | ('2002', 'Dubai') | 200 | 89 | nan | nan | | ('2001', 'Abu Dhabi') | nan | nan | Performed | 45 | | ('2001', 'Abu Dhabi') | nan | nan | Not Performed | 76 | | ('2001', 'Dubai') | nan | nan | Performed | 90 | | ('2001', 'Dubai') | nan | nan | Not Performed | 50 | | ('2002', 'Abu Dhabi') | nan | nan | Performed | 78 | | ('2002', 'Abu Dhabi') | nan | nan | Not Performed | 45 | | ('2002', 'Dubai') | nan | nan | Performed | 76 | | ('2002', 'Dubai') | nan | nan | Not Performed | 58 |

, поэтому два кадра данных, соединенные вместе, не должны иметь дубликаты (как первое объединенное) или сдвигаться вниз (как вариант concat).Какое решение может быть для того, чтобы 2 кадра данных были хорошо выровнены?

Вот как может выглядеть желаемый результат:

| | Year | Emirate | Capacity | Number | Type | Value | |---:|-------:|:----------|:-----------|---------:|:--------------|--------:| | 0 | | | 100- | 462 | Performed | 45 | | 1 | | Abu Dhabi | 100 | 44 | Not Performed | 76 | | 2 | | | 200 | 657 | NaN | nan | | 3 | 2001 | | 100- | 40 | Performed | 90 | | 4 | | Dubai | 100 | 30 | Not Performed | 50 | | 5 | | | 200 | 51 | NaN | nan | | 6 | | | 100- | 300 | Performed | 78 | | 7 | | Abu Dhabi | 100 | 220 | Not Performed | 45 | | 8 | 2002 | | 200 | 56 | NaN | nan | | 9 | | | 100- | 55 | Performed | 76 | | 10 | | Dubai | 100 | 67 | Not Performed | 58 | | 11 | | | 200 | 89 | NaN | nan |

enter code here

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я предположил, что ваши данные еще не верны, поскольку ваш ожидаемый вывод возможен, но не с вашей логикой прямо сейчас.

Вам не хватает третьего key column в second_df, что capacity,Если мы добавим этот столбец и выполним left merge, мы сможем достичь ожидаемого результата.

Кстати, нам не нужно указывать столбцы в качестве индекса, поэтому решение выглядит следующим образом.

# Clean up and create correct dataframes
first_df=pd.DataFrame([['2001','Abu Dhabi','100-','462'],
                       ['2001','Abu Dhabi','100','44'],
                       ['2001','Abu Dhabi','200','657'],
                       ['2001','Dubai','100-','40'],
                       ['2001','Dubai','100','30'],
                       ['2001','Dubai','200','51'],
                       ['2002','Abu Dhabi','100-','300'],
                       ['2002','Abu Dhabi','100','220'],
                       ['2002','Abu Dhabi','200','56'],
                       ['2002','Dubai','100-','55'],
                       ['2002','Dubai','100','67'],
                       ['2002','Dubai','200','89']],columns=['Year','Emirate','Capacity','Number'])
second_df=pd.DataFrame([['2001','Abu Dhabi','100-','Performed','45'],
                        ['2001','Abu Dhabi','100','Not Performed','76'],
                        ['2001','Abu Dhabi','','',''],
                        ['2001','Dubai','100-','Performed','90'],
                        ['2001','Dubai','100','Not Performed','50'],
                        ['2001','Dubai','','',''],
                        ['2002','Abu Dhabi','100-','Performed','78'],
                        ['2002','Abu Dhabi','100','Not Performed','45'],
                        ['2002','Abu Dhabi','', '', ''],
                        ['2002','Dubai','100-','Performed','76'],
                        ['2002','Dubai','100','Not Performed','58'],
                        ['2002','Dubai', '', '', '']],columns=['Year','Emirate','Capacity','Type','Value'])

# Perform a left merge to get correct output
merged=first_df.merge(second_df,how='left',on=['Year', 'Emirate', 'Capacity'])

Вывод

    Year    Emirate     Capacity    Number  Type            Value
0   2001    Abu Dhabi   100-        462     Performed       45
1   2001    Abu Dhabi   100         44      Not Performed   76
2   2001    Abu Dhabi   200         657     NaN             NaN
3   2001    Dubai       100-        40      Performed       90
4   2001    Dubai       100         30      Not Performed   50
5   2001    Dubai       200         51      NaN             NaN
6   2002    Abu Dhabi   100-        300     Performed       78
7   2002    Abu Dhabi   100         220     Not Performed   45
8   2002    Abu Dhabi   200         56      NaN             NaN
9   2002    Dubai       100-        55      Performed       76
10  2002    Dubai       100         67      Not Performed   58
11  2002    Dubai       200         89      NaN             NaN
0 голосов
/ 02 марта 2019

Я вижу проблему здесь, ваши данные таким образом, что это приводит к перекрестному соединению, когда вы присоединяетесь к ['year','Emirate'].Например, Абу-Даби 2001 года присоединился к Абу-Даби 2001 года в обоих фреймах данных за "выполнено и не выполнено".По сути, это mxn отношение, объединяющее наборы данных.Если вы не укажете первичный ключ, который может уникально идентифицировать каждую строку, вы получите одинаковые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...