我有两个具有相同列名的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
答案 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)
您是否尝试过结合使用map
和fillna
来使用非穷举映射?
基本上,您需要根据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
值,这意味着它不会更新任何现有值这两个字典的键名都不相同。
希望这会有所帮助:))。