根据特定条件根据另一个数据帧更新数据帧

时间:2017-06-08 17:10:22

标签: python pandas dataframe

我有两个数据框df1df2。 Df1具有列A,B,C,D,E,F和df2 A,B,J,D,E,K。我想用第一个数据行更新第二个数据帧,但只有当两个第一列在两个数据帧中具有相同的值时才会更新。对于满足以下两个条件的每一行:

  1. df1.A = df2.A
  2. df1.B = df2.B
  3. 然后相应更新:

    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']
    

1 个答案:

答案 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的相应行的列Edf1的值,并重命名旧列。 接下来的两行填写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");

虽然我强烈反对这样做。如果你发现自己正在考虑这个问题,那么在熊猫中做这件事可能要快得多,不那么痛苦,或者你最好使用另一种不太关注表格数据的工具。