Обновить несколько столбцов данных из другого кадра данных - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть два кадра данных:

df1

         Date         ID Company     Symbol  Shares  Value
0  2014-09-30   32511907     foo        NaN      10    101
1  2014-09-30   32511957     bar  No Symbol      10    101
2  2014-12-31   32511907    test  No Symbol      18    152
3  2013-06-30   32511107      AA        APC      43    373
4  2014-06-30  166764100      CC        CVX      29    381
5  2014-09-30  166764900       C  No Symbol      13    155
6  2014-09-30  166764950   C Inc  No Symbol      13    155
7  2015-09-30  475643276    Test        NaN      13    155

И df2:

   Company         ID     Symbol
0   AA Inc   32511907        AAA
1   AA Inc   32511957  No Symbol
2   BB Inc   32511107        APC
3  CC Corp  166764100        CVX
4   CC Inc  166764900  No Symbol
5   CC Inc  166764950  No Symbol

Используя ID в качестве ключа, я нужно заменить Symbol и Company в df1 на те, что в df2, чтобы выходные данные выглядели так:

         Date         ID Company     Symbol  Shares  Value
0  2014-09-30   32511907  AA Inc        AAA      10    101
1  2014-09-30   32511957  AA Inc  No Symbol      10    101
2  2014-12-31   32511907  AA Inc        AAA      18    152
3  2013-06-30   32511107  BB Inc        APC      43    373
4  2014-06-30  166764100 CC Corp        CVX      29    381
5  2014-09-30  166764900  CC Inc  No Symbol      13    155
6  2014-09-30  166764950  CC Inc  No Symbol      13    155
7  2015-09-30  475643276    Test        NaN      13    155

Я пробовал:

df = df1.set_index('ID')
df.update(df2.set_index('ID'))
df = df1.loc[df1.Symbol == '', ['Company', 'Symbol']] = df.reset_index()

Но при выполнении с полным набором данных я получаю ValueError: cannot reindex from a duplicate axis, потому что строка df.update(df2.set_index('ID')) делает индекс ID, что приводит к нескольким дубликатам.

Так есть ли альтернативы для достижения желаемого результата?

1 Ответ

0 голосов
/ 11 апреля 2020

Pd.merge может решить эту проблему. Предположим, вам нужны только идентификаторы в df1

result = pd.merge(left=df1[['Date', 'ID', 'Shares', 'Values']], 
                  right=df2, on=['ID'], how='left')

Если вам нужно объединить разные метки, вы можете использовать left_on и right_on.

Измените аргумент how, чтобы указать, какие идентификаторы хранить

  • сохранить идентификаторы имели место только в df1 ('слева')
  • сохранить идентификаторы имели место только в df2 (' right ')
  • keep все идентификаторы произошли как в df1, так и в df2 («внешний»)
  • keep only идентификаторы произошли как в df1, так и df1 («внутренний»)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...