Python 如何基于来自另一个数据帧的值高效地修改数据帧中的值?

Python 如何基于来自另一个数据帧的值高效地修改数据帧中的值?,python,pandas,dataframe,join,merge,Python,Pandas,Dataframe,Join,Merge,我有两个数据帧,如下所示: import pandas as pd data1 = {'Col1':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], 'Col2':[3.409836, 2.930693, 2.75, 3.140845, 2.971429, 2.592593, 2.6, 3.1875, 2.857143, 0.714286]} df1 = pd.DataFrame(data1, columns=['Col1',

我有两个数据帧,如下所示:

import pandas as pd
data1 = {'Col1':['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
        'Col2':[3.409836, 2.930693, 2.75, 3.140845, 2.971429, 2.592593, 2.6, 3.1875, 2.857143, 0.714286]}
df1 = pd.DataFrame(data1, columns=['Col1', 'Col2'])

data2 = {'Col1':['B', 'F', 'I'],
         'Col2':[23.45, 32.57, 19.85]}
df2 = pd.DataFrame(data2, columns=['Col1', 'Col2'])

我想用
df2
中的值修改
df1
Col2
的值。这是我的代码:

for i in range(len(df2)):
    for j in range(len(df1)):
        if df2['Col1'][i]==df1['Col1'][j]:
            df1['Col2'][j]=df2['Col2'][i]
守则的作用是:

但问题是,对于大型数据帧,此代码的速度会很慢,因为它具有复杂性
O(len(df1)*len(df2))
。如何以更快、更高效的方式合并这两个数据帧

我尝试使用外部联接合并数据帧,但它没有产生正确的结果-它保留了两个值:

pd.merge(df1, df2, how='outer')


如果仅使用一列,则内部联接生成空白数据帧,左联接生成与
df1
相同的数据帧,右联接生成与
df2
相同的数据帧:

如果可能有多个列,请使用带有左连接和指定列的
合并

cols = df1.columns.difference(['Col1'])
orig_cols = [f'{x}_' for x in cols]

df = pd.merge(df1, df2, how='left', on='Col1', suffixes=('_',''))
print (df)
  Col1     Col2_   Col2
0    A  3.409836    NaN
1    B  2.930693  23.45
2    C  2.750000    NaN
3    D  3.140845    NaN
4    E  2.971429    NaN
5    F  2.592593  32.57
6    G  2.600000    NaN
7    H  3.187500    NaN
8    I  2.857143  19.85
9    J  0.714286    NaN
然后用原始列替换添加列中缺少的值,最后将其删除:

df[cols] = df[cols].fillna(df[orig_cols].rename(columns=lambda x: x.strip('_')))
df = df.drop(orig_cols, axis=1)

print (df)
  Col1       Col2
0    A   3.409836
1    B  23.450000
2    C   2.750000
3    D   3.140845
4    E   2.971429
5    F  32.570000
6    G   2.600000
7    H   3.187500
8    I  19.850000
9    J   0.714286
请尝试以下代码:

df4=df3.Col3.isnull()
df3=pd.merge(df1, df2,how='outer')
df4=df3[df3.Col3.isnull()]
df5=df3[df3.Col3.notnull()]
df5.Col2=df5.Col3
df6=df4.append(df5)
df6=df6.drop('Col3',axis=1)

df6是您正在寻找的输出

你能不能也编辑一下答案,添加使用多列的解决方案?@Kristada673-我试过了,请检查一下。太棒了!还有一件事-我如何在
df1
中添加另一个名为
Col3
的列,如果值已根据
df2
修改,该列将显示
modified
,或者
original
如果不是这样?@Kristada673-我认为
merge
是它的参数-
df=pd.merge(df1,df2,how='left',on='Col1',后缀=(''u'','',indicator=True)
@Kristada673-bith表示值在两个df中,因此被替换
df4=df3.Col3.isnull()
df3=pd.merge(df1, df2,how='outer')
df4=df3[df3.Col3.isnull()]
df5=df3[df3.Col3.notnull()]
df5.Col2=df5.Col3
df6=df4.append(df5)
df6=df6.drop('Col3',axis=1)