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

Я пытаюсь слиться с пандами данных, хотя то, что я хочу, на самом деле не может быть слиянием.

У меня совпадают два столбца в двух кадрах, один столбец имеет уникальные значения, которые можно использовать для объединения. другой столбец имеет одно пустое поле и одно заполненное.

Я хочу перезаписать поля emtpy при сопоставлении с уникальными полями, но оставить только тот столбец, который перезаписан, я не хочу, чтобы остальные столбцы были из второго DataFrame.

надеюсь, что ниже объяснит немного дальше

>>> animals = [{"animal" : "dog", "name" : "freddy", "food" : ""},{"animal" : "cat", "name" : "dexter", "food" : ""},{"animal" : "dog", "name" : "lou lou", "food" : ""}]
>>> foods = [{"name" : "freddy", "food" : "dog mix", "brand" : "doggys dog"},{"name" : "dexter", "food" : "fussy cat mix", "brand" : "fish fishy"},{"name" : "lou lou", "food" : "bones", "brand" : "i was a cow"}]
>>> a_pd = pd.DataFrame(animals)
>>> a_pd
  animal food     name
0    dog        freddy
1    cat        dexter
2    dog       lou lou
>>> f_pd = pd.DataFrame(foods)
>>> f_pd
         brand           food     name
0   doggys dog        dog mix   freddy
1   fish fishy  fussy cat mix   dexter
2  i was a cow          bones  lou lou
>>>
>>>
>>> animal_data = a_pd.merge(f_pd, on='name', how='left')
>>> animal_data
  animal food_x     name        brand         food_y
0    dog          freddy   doggys dog        dog mix
1    cat          dexter   fish fishy  fussy cat mix
2    dog         lou lou  i was a cow          bones
>>>

У меня просто должна быть еда, и мне не нужен бренд (также обратите внимание, что это примерные данные, а в живых данных гораздо больше столбцов

желаемых результатов

>>> animal_data
  animal        name            food
0    dog      freddy         dog mix
1    cat      dexter   fussy cat mix
2    dog     lou lou           bones

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Лучше всего объединить представления фреймов данных, которые не содержат столбцы, которые вам не нужны в объединенном фрейме данных. Например:

a_cols = ['animal', 'name']
f_cols = ['food', 'name']
a_pd[a_cols].merge(f_pd[f_cols], on='name', how='left')

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

0 голосов
/ 11 сентября 2018

Вы можете использовать update

a_pd.set_index('name',inplace=True)
a_pd.update(f_pd.set_index('name'))
a_pd
Out[68]: 
        animal           food
name                         
freddy     dog        dog mix
dexter     cat  fussy cat mix
lou lou    dog          bones
a_pd.reset_index()
Out[69]: 
      name animal           food
0   freddy    dog        dog mix
1   dexter    cat  fussy cat mix
2  lou lou    dog          bones

Или мы используем map

a_pd.food=a_pd.name.map(f_pd.set_index('name').food)
a_pd
Out[74]: 
  animal           food     name
0    dog        dog mix   freddy
1    cat  fussy cat mix   dexter
2    dog          bones  lou lou
0 голосов
/ 11 сентября 2018

Я бы либо попытался drop, либо просто выбрал столбцы, которые вы хотите сохранить:

animal_data.drop(['food_x', 'brand'], axis=1, inplace=True)

или

animal_data = animal_data[['animal', 'name', 'food']]
0 голосов
/ 11 сентября 2018

Использование:

animal_data = a_pd.merge(f_pd, on='name', how='left', suffixes=('_x','')).drop('food_x', axis=1)

Выход:

  animal     name        brand           food
0    dog   freddy   doggys dog        dog mix
1    cat   dexter   fish fishy  fussy cat mix
2    dog  lou lou  i was a cow          bones

Или

a_pd[['animal','name']].merge(f_pd, how='left')

Выход:

  animal     name        brand           food
0    dog   freddy   doggys dog        dog mix
1    cat   dexter   fish fishy  fussy cat mix
2    dog  lou lou  i was a cow          bones
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...