我有两个数据框df1
和df2
。 Df1具有列A,B,C,D,E,F和df2
A,B,J,D,E,K。我想用第一个数据行更新第二个数据帧,但只有当两个第一列在两个数据帧中具有相同的值时才会更新。对于满足以下两个条件的每一行:
df1.A = df2.A
df1.B = df2.B
然后相应更新:
df2.D = df1.D
df2.E = df1.E
我的数据框有不同的行数。
当我尝试这段代码时,我得到一个TypeError:无法使用'str'类型的索引器进行位置索引。
for a in df1:
for t in df2:
if df1.iloc[a]['A'] == df2.iloc[t]['A'] and df1.iloc[a]['B'] == df2.iloc[t]['B']:
df2.iloc[t]['D'] = df1.iloc[a]['D']
df2.iloc[t]['E'] = df1.iloc[a]['E']
答案 0 :(得分:0)
问题:
合并数据帧比进行嵌套迭代更好。
df2 = df2.merge(df1[['A', 'B', 'D', 'E']], on=['A', 'B'], how='left', suffixes=['_old', ''])
df2['D'] = df2['D'].fillna(df2['D_old'])
df2['E'] = df2['E'].fillna(df2['E_old'])
del df2['D_old']
del df2['E_old']
第一行将df2
的列附加到D
的相应行的列E
和df1
的值,并重命名旧列。
接下来的两行填写df1
没有匹配行的行,接下来的两行删除列的初始,现在过时的版本。
错误:
TypeError
发生了for a in df1:
因为.iloc
遍历数据框的列(这里是字符串),而for a in df1.iterrows():
for t in df2.iterrows():
if df1.loc[a, 'A'] == ...
只采用整数。此外,虽然您没有达到这一点,但要设置一个值,您需要括号中包含索引和列。
因此,如果您确实需要按行设置值,则需要更像
的内容UPDATE tblMaster Set SoftwareID = DLookUp("SWID","Software","InStr('" & [Title] & "', [Software Title])>0");
虽然我强烈反对这样做。如果你发现自己正在考虑这个问题,那么在熊猫中做这件事可能要快得多,不那么痛苦,或者你最好使用另一种不太关注表格数据的工具。