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)