Python将NaN行替换为另一个数据帧中具有相同日期索引的行

Python将NaN行替换为另一个数据帧中具有相同日期索引的行,python,pandas,Python,Pandas,我有两个数据帧,看起来像这样: 2001-01-03 00:00:00 NaN NaN NaN NaN NaN 2001-01-03 00:01:00 0.95110 0.95110 0.95110 0.95110 4.0 2001-01-03 00:02:00 0.95100 0.95110 0.95100 0.95110 4.0 2001-01-03 00:03:00 0.95100 0.95100 0.95100 0.9

我有两个数据帧,看起来像这样:

2001-01-03 00:00:00      NaN      NaN      NaN      NaN  NaN
2001-01-03 00:01:00  0.95110  0.95110  0.95110  0.95110  4.0
2001-01-03 00:02:00  0.95100  0.95110  0.95100  0.95110  4.0
2001-01-03 00:03:00  0.95100  0.95100  0.95100  0.95100  4.0
2001-01-03 00:04:00  0.95090  0.95090  0.95090  0.95090  4.0
2001-01-03 00:05:00  0.95100  0.95100  0.95100  0.95100  4.0
df = df.apply(lambda x: df2.ix[x['row']] if x.isnull().any() else x)
我要做的是用另一个df中相同日期索引的行替换一个df中的任何NaN行

我试过这样的方法:

2001-01-03 00:00:00      NaN      NaN      NaN      NaN  NaN
2001-01-03 00:01:00  0.95110  0.95110  0.95110  0.95110  4.0
2001-01-03 00:02:00  0.95100  0.95110  0.95100  0.95110  4.0
2001-01-03 00:03:00  0.95100  0.95100  0.95100  0.95100  4.0
2001-01-03 00:04:00  0.95090  0.95090  0.95090  0.95090  4.0
2001-01-03 00:05:00  0.95100  0.95100  0.95100  0.95100  4.0
df = df.apply(lambda x: df2.ix[x['row']] if x.isnull().any() else x)
但它只是抛出了一堆错误,即使我能让它工作,也可能不是最理想的方法。 据我所知,使用.update()可能是可行的,但我还没有弄清楚,因此如果有人能提供帮助,我将不胜感激。

您可以使用:

或:

或:

但在两个数据帧中都需要相同的列名

样本:

df1 = pd.DataFrame({1: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 2: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 3: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 4: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 5: {pd.Timestamp('2001-01-03 00:01:00'): 4.0, pd.Timestamp('2001-01-03 00:03:00'): 4.0, pd.Timestamp('2001-01-03 00:02:00'): 4.0, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 4.0, pd.Timestamp('2001-01-03 00:04:00'): 4.0}})
df2 = pd.DataFrame({1: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 2: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 3: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 4: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 5: {pd.Timestamp('2001-01-03 00:01:00'): 4.0, pd.Timestamp('2001-01-03 00:00:00'): 4.0}})

print (df1)
                          1       2       3       4    5
2001-01-03 00:00:00     NaN     NaN     NaN     NaN  NaN
2001-01-03 00:01:00  0.9511  0.9511  0.9511  0.9511  4.0
2001-01-03 00:02:00  0.9510  0.9511  0.9510  0.9511  4.0
2001-01-03 00:03:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:04:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:05:00  0.9510  0.9510  0.9510  0.9510  4.0

print (df2)
                          1       2       3       4    5
2001-01-03 00:00:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:01:00  0.9510  0.9510  0.9510  0.9510  4.0

df.fillna(df2)
不起作用吗?先检查方法组合
df.combine_first(df2)
df1.update(df2,overwrite=False)-禁用覆盖,以便所有方法都给出相同的o/p?@NickilMaveli-谢谢。显然是的。
df1 = pd.DataFrame({1: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 2: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 3: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 4: {pd.Timestamp('2001-01-03 00:01:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:03:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:02:00'): 0.95109999999999995, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:04:00'): 0.95089999999999997}, 5: {pd.Timestamp('2001-01-03 00:01:00'): 4.0, pd.Timestamp('2001-01-03 00:03:00'): 4.0, pd.Timestamp('2001-01-03 00:02:00'): 4.0, pd.Timestamp('2001-01-03 00:00:00'): np.nan, pd.Timestamp('2001-01-03 00:05:00'): 4.0, pd.Timestamp('2001-01-03 00:04:00'): 4.0}})
df2 = pd.DataFrame({1: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 2: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 3: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 4: {pd.Timestamp('2001-01-03 00:01:00'): 0.95099999999999996, pd.Timestamp('2001-01-03 00:00:00'): 0.95089999999999997}, 5: {pd.Timestamp('2001-01-03 00:01:00'): 4.0, pd.Timestamp('2001-01-03 00:00:00'): 4.0}})

print (df1)
                          1       2       3       4    5
2001-01-03 00:00:00     NaN     NaN     NaN     NaN  NaN
2001-01-03 00:01:00  0.9511  0.9511  0.9511  0.9511  4.0
2001-01-03 00:02:00  0.9510  0.9511  0.9510  0.9511  4.0
2001-01-03 00:03:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:04:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:05:00  0.9510  0.9510  0.9510  0.9510  4.0

print (df2)
                          1       2       3       4    5
2001-01-03 00:00:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:01:00  0.9510  0.9510  0.9510  0.9510  4.0
df = df1.combine_first(df2)
print (df)
                          1       2       3       4    5
2001-01-03 00:00:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:01:00  0.9511  0.9511  0.9511  0.9511  4.0
2001-01-03 00:02:00  0.9510  0.9511  0.9510  0.9511  4.0
2001-01-03 00:03:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:04:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:05:00  0.9510  0.9510  0.9510  0.9510  4.0

df = df1.fillna(df2)
print (df)
                          1       2       3       4    5
2001-01-03 00:00:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:01:00  0.9511  0.9511  0.9511  0.9511  4.0
2001-01-03 00:02:00  0.9510  0.9511  0.9510  0.9511  4.0
2001-01-03 00:03:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:04:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:05:00  0.9510  0.9510  0.9510  0.9510  4.0

df1.update(df2)
print (df1)
                          1       2       3       4    5
2001-01-03 00:00:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:01:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:02:00  0.9510  0.9511  0.9510  0.9511  4.0
2001-01-03 00:03:00  0.9510  0.9510  0.9510  0.9510  4.0
2001-01-03 00:04:00  0.9509  0.9509  0.9509  0.9509  4.0
2001-01-03 00:05:00  0.9510  0.9510  0.9510  0.9510  4.0