从另一个数据框中更新数据框中的缺失值

时间:2019-05-08 12:19:09

标签: python pandas missing-data

我的数据框缺少值。我需要以两种方式更新缺失值。 1.根据最新日期和ID来自同一数据框。 2.根据日期和ID从另一个数据框中获取

df
id  date        name    location    type
11  08-05-2019  aim     ind         ss
12  08-05-2019  paul    uk          ee
11  08-04-2019  aim     ee
13  08-05-2019  tera    uk          jj
13  08-01-2019  tera                kk
15  08-09-2019          usa         ii
15  08-05-2019          uk          ii
13  08-05-2019  tera    uk

基于基于ID和最新日期从同一数据框中填充nan的预期输出

df1
id  date        name    location    type
11  08-05-2019  aim     ind         ss
12  08-05-2019  paul    uk          ee
11  08-04-2019  aim     ind         ss
13  08-05-2019  tera    uk          jj
13  08-01-2019  tera    uk          kk
15  08-09-2019          usa         ii
15  08-05-2019          uk          ii
13  08-05-2019  tera    uk          jj

在df1中,我仅需要基于日期和id列替换数据框y中的nan值。

y
id  date        name    location    type    rev
11  08-05-2019  aim     ind         ss      yes
12  08-05-2019  paul    uk          ee      no
11  08-04-2019  aim     ind         ee      yes
13  08-05-2019  tera    uk          jj      yes
13  08-01-2019  tera    uk          kk      yes
15  08-09-2019  sam     usa         ii      no
15  08-05-2019  jim     uk          ii      no
13  08-05-2019  tera    uk          kk      no
14  09-05-2019  tiya    uk          kk      yes
15  10-05-2019  tiya    ind         kk      yes

我在第二个选项中尝试了此代码,但无法正常工作。

y.set_index(['id','date']).combine_first(df1.set_index(['id','date'])).reset_index()

df, y = df.set_index('id','date'), y.set_index('id','date')
df.update(y)
df.reset_index(inplace=True)

但出现多索引错误

我无法从df中获取df1,因此直接尝试在y的帮助下更新df

最终预期输出是

id  date        name    location    type
11  08-05-2019  aim     ind         ss
12  08-05-2019  paul    uk          ee
11  08-04-2019  aim     ind         ee
13  08-05-2019  tera    uk          jj
13  08-01-2019  tera    uk          kk
15  08-09-2019  sam     usa         ii
15  08-05-2019  jim     uk          ii
13  08-05-2019  tera    uk          kk

1 个答案:

答案 0 :(得分:0)

您刚刚获得了相反的数据框名称。以下应该可以工作

df1.set_index(['id','date']).combine_first(y[df1.columns].set_index(['id','date'])).reset_index()