使用另一个数据更新一个数据帧,用于一个特定列 - Pandas和Python

时间:2018-05-25 21:07:46

标签: python pandas dataframe

我尝试使用另一个数据更新一个数据框,其中一个特定列名为“数据”。这两个数据框都有唯一的ID caled列' ID'。两列都有一个数据'柱。我想要数据来自数据'在df2中,仅覆盖df1中的行数,覆盖df1'数据'中的条目。哪里没有相应的ID'在df2中,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和combine_first然而似乎无法获得正确的组合。

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

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

创建新数据框

以下是使用更新的一种方法:

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

或者我们可以使用maps / 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:

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)

或者如果ID不是索引:

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