Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖不同大小的数据帧中的列_Python_Pandas_Dataframe - Fatal编程技术网

Python 覆盖不同大小的数据帧中的列

Python 覆盖不同大小的数据帧中的列,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下两个数据帧: df1 = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[0,0,1,1,0]}) df2 = pd.DataFrame({'ids':[1,5],'cost':[1,4]}) 只要ID中有匹配项,我想用df2上的值更新df1的值。所需的数据帧如下所示: df_result = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[1,0,1,1,4]}) 我如何从上面两个数据帧中得到它 我尝试过使用merge

我有以下两个数据帧:

df1 = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[0,0,1,1,0]})
df2 = pd.DataFrame({'ids':[1,5],'cost':[1,4]})
只要ID中有匹配项,我想用df2上的值更新df1的值。所需的数据帧如下所示:

df_result = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[1,0,1,1,4]})
我如何从上面两个数据帧中得到它

我尝试过使用merge,但记录较少,而且它保留了两列:

results = pd.merge(df1,df2,on='ids')
results.to_dict()
{'cost_x': {0: 0, 1: 0}, 'cost_y': {0: 1, 1: 4}, 'ids': {0: 1, 1: 5}}

您可以通过左合并执行此操作:

merged = pd.merge(df1, df2, on='ids', how='left')
merged['cost'] = merged.cost_x.where(merged.cost_y.isnull(), merged['cost_y'])
result = merged[['ids','cost']]
但是,如果将ID设置为索引列,则可以避免合并(并获得更好的性能);然后,熊猫可以使用此选项为您对齐结果:

df1 = df1.set_index('ids')
df2 = df2.set_index('ids')

df1.cost.where(~df1.index.isin(df2.index), df2.cost)
ids
1    1.0
2    0.0
3    1.0
4    1.0
5    4.0
Name: cost, dtype: float64

您可以使用set_index和combine first为df2中的值赋予优先级

df_result = df2.set_index('ids').combine_first(df1.set_index('ids'))
df_result.reset_index()
你得到

   ids  cost
0   1   1
1   2   0
2   3   1
3   4   1
4   5   4

另一种方法是,使用临时合并的数据帧,使用后可以丢弃该数据帧

import pandas as pd

df1 = pd.DataFrame({'ids':[1,2,3,4,5],'cost':[0,0,1,1,0]})
df2 = pd.DataFrame({'ids':[1,5],'cost':[1,4]})

dftemp = df1.merge(df2,on='ids',how='left', suffixes=('','_r'))
print(dftemp)

df1.loc[~pd.isnull(dftemp.cost_r), 'cost'] = dftemp.loc[~pd.isnull(dftemp.cost_r), 'cost_r']
del dftemp 

df1 = df1[['ids','cost']]
print(df1)


OUTPUT-----:
dftemp:
   cost  ids  cost_r
0     0    1     1.0
1     0    2     NaN
2     1    3     NaN
3     1    4     NaN
4     0    5     4.0

df1:
   ids  cost
0    1   1.0
1    2   0.0
2    3   1.0
3    4   1.0
4    5   4.0