обновить один фрейм данных данными из другого, для одного конкретного столбца - Pandas и Python - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь обновить один фрейм данных данными из другого, для одного конкретного столбца под названием «Данные».Оба кадра данных имеют уникальный идентификатор, идентифицируемый столбцом «ID».Оба столбца имеют столбец «Данные».Я хочу, чтобы данные из 'Data' в df2 перезаписывали записи в df1 'Data', только для количества строк в df1.Если в df2 нет соответствующего 'ID', должна оставаться запись df1.

import pandas as pd

data1 = '''\
ID Data Data1
1  AA   BB
2  AB   BF
3  AC   BK
4  AD   BL'''

data2 = '''\
ID Data
1  AAB
3  AAL
4  MNL
5  AAP
6  MNX
8  DLP
9  POW'''

df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')

Ожидаемый результат:

new df3 expected outcome.

ID Data Data1
1  AAB  BB
2  AB   BF
3  AAL  BK
4  MNL  BL

df2 - это основной список значений, который никогда не изменяется и имеет тысячизаписей, где df1 иногда имеет только несколько сотен записей.

Я посмотрел на pd.merge и comb_first, но не могу получить правильную комбинацию.

df3 = pd.merge (df1, df2, on = 'ID', how = 'left')

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 мая 2018

Создать новый фрейм данных

Вот один из способов использования обновления:

df3 = df1[:].set_index('ID')
df3['Data'].update(df2.set_index('ID')['Data'])
df3.reset_index(inplace=True)

Или мы можем использовать карты / dicts и переназначить (Python> = 3.5)

m = {**df1.set_index('ID')['Data'], **df2.set_index('ID')['Data']}
df3 = df1[:].assign(Data=df1['ID'].map(m))

Python <3.5: </p>

m = df1.set_index('ID')['Data']
m.update(df2.set_index('ID')['Data'])

df3 = df1[:].assign(Data=df1['ID'].map(m))

Обновление df1

Вы открыты для обновления df1?В этом случае:

df1.update(df2)

Или, если идентификатор не индекс:

m = df2.set_index('ID')['Data']
df1.loc[df1['ID'].isin(df2['ID']),'Data'] =df1['ID'].map(m)

Или:

df1.set_index('ID',inplace=True)
df1.update(df2.set_index('ID'))
df1.reset_index(inplace=True)

Примечание.кое-что, что имеет больше смысла:)


Полный пример:

import pandas as pd

data1 = '''\
ID Data Data1
1  AA   BB
2  AB   BF
3  AC   BK
4  AD   BL'''

data2 = '''\
ID Data
1  AAB
3  AAL
4  MNL
5  AAP
6  MNX
8  DLP
9  POW'''

df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')

m = {**df1.set_index('ID')['Data'], **df2.set_index('ID')['Data']}
df3 = df1[:].assign(Data=df1['ID'].map(m))

print(df3)

Возвращает:

   ID Data Data1
0   1  AAB    BB
1   2   AB    BF
2   3  AAL    BK
3   4  MNL    BL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...