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