使用loc和map更改多个列中的值

时间:2019-08-23 12:35:05

标签: python pandas numpy csv

我有两个具有相同列名的DataFrame,并且每一行都有唯一的Import_ID。我想基于相同的Import_ID将2列中的缺失值从df1导入到df2。

我已经对一列进行了此操作,并且工作正常,但是我想同时对2列进行此操作。 我写了一篇专栏文章:

df2.loc[(numpy.isnan(df2['DeliveryNoteNo']))& (~numpy.isnan(df1['DeliveryNoteNo'])), 'DeliveryNoteNo'] = df2['Import_ID'].map(df1.set_index('Import_ID')['DeliveryNoteNo'])

这很好用,所以我想对2列做同样的事情,所以每次我执行一次df2更新时,它也会给出更新的日期。

我尝试了这个,但是它只返回一个错误:“ TypeError:'DataFrame'对象不可调用”

df2.loc[(numpy.isnan(df2.InvoiceNo))& (~numpy.isnan(df1['InvoiceNo'])), ['InvoiceNo','Modified_Date']] = df2['Import_ID'].map(df1.set_index('Import_ID')[['InvoiceNo', 'Modified_Date']])

例如: df1:

     InvoiceNo     OrderNo  DeliveryNoteNo     Modified_Date   Import_ID
0   950094591.0  7027514279    1.000000e+00  23-08-2019 14:30  7027514279_100
1   950094591.0  7027514279    2.000000e+00  23-08-2019 14:30  7027514279_100.1
2                7027514279                  23-08-2019 14:30  7027514279_100.2

df2:

     InvoiceNo     OrderNo  DeliveryNoteNo     Modified_Date   Import_ID
0                7027514279    1.000000e+00  21-08-2019 14:30  7027514279_100
1   950094591.0  7027514279                  21-08-2019 14:30  7027514279_100.1
2                7027514279                  21-08-2019 14:30  7027514279_100.2

df2稍后应如下所示:

     InvoiceNo     OrderNo  DeliveryNoteNo     Modified_Date   Import_ID
0   950094591.0  7027514279    1.000000e+00  23-08-2019 14:30  7027514279_100
1   950094591.0  7027514279    2.000000e+00  23-08-2019 14:30  7027514279_100.1
2                7027514279                  21-08-2019 14:30  7027514279_100.2

2 个答案:

答案 0 :(得分:0)

尝试一下

df2.set_index('Import_ID').combine_first(df1.set_index('Import_ID')).reset_index(drop=True)

输出:

        InvoiceNo     OrderNo  DeliveryNoteNo     Modified_Date
0     950094591.0  7027514279             1.0  21-08-2019 14:30
1     950094591.0  7027514279             2.0  21-08-2019 14:30
2             NaN  7027514279             NaN  21-08-2019 14:30

答案 1 :(得分:0)

您是否尝试过结合使用mapfillna来使用非穷举映射?

基本上,您需要根据df1中的列值首先创建两个字典,以将要更新的值放在df2的2列中:

dictionary_1 = dict(zip(df1['Import_ID'], df1['DeliveryNoteNo']))
dictionary_2 = dict(zip(df1['Import_ID'], df1['InvoiceNo']))

然后,您使用这些字典来更新df2,但是如果返回fillna,则使用df2,其参数等于False列中的原始值:

df2['DeliveryNoteNo'] = df2['Import_ID'].map(dictionary_1).fillna(df2['DeliveryNoteNo'])

对第二列进行相同的更新:

df2['InvoiceNo'] = df2['Import_ID'].map(dictionary_1).fillna(df2['InvoiceNo'])

如果fillna返回Nan,则map参数不会为您的列提供False值,这意味着它不会更新任何现有值这两个字典的键名都不相同。

希望这会有所帮助:))。