Python 基于多索引的填充NaN
我有一个pandas数据框,我想填入一些NaN值Python 基于多索引的填充NaN,python,pandas,Python,Pandas,我有一个pandas数据框,我想填入一些NaN值 import pandas as pd tuples = [('a', 1990),('a', 1994),('a',1996),('b',1992),('b',1997),('c',2001)] index = pd.MultiIndex.from_tuples(tuples, names = ['Type', 'Year']) vals = ['NaN','NaN','SomeName','NaN','SomeOtherName','Som
import pandas as pd
tuples = [('a', 1990),('a', 1994),('a',1996),('b',1992),('b',1997),('c',2001)]
index = pd.MultiIndex.from_tuples(tuples, names = ['Type', 'Year'])
vals = ['NaN','NaN','SomeName','NaN','SomeOtherName','SomeThirdName']
df = pd.DataFrame(vals, index=index)
print(df)
0
Type Year
a 1990 NaN
1994 NaN
1996 SomeName
b 1992 NaN
1997 SomeOtherName
c 2001 SomeThirdName
我想要的输出是:
Type Year
a 1990 SomeName
1994 SomeName
1996 SomeName
b 1992 SomeOtherName
1997 SomeOtherName
c 2001 SomeThirdName
这需要在更大的数据帧(数百万行)上完成,其中每个“类型”可以有1-5个唯一的“年份”,并且名称值仅在最近一年出现。为了提高性能,我尽量避免对行进行迭代。您可以按索引按降序对数据帧进行排序,然后
ffill
it:
import pandas as pd
df.sort_index(level = [0,1], ascending = False).ffill()
# 0
# Type Year
# c 2001 SomeThirdName
# b 1997 SomeOtherName
# 1992 SomeOtherName
# a 1996 SomeName
# 1994 SomeName
# 1990 SomeName
注意:示例数据实际上不包含np.nan
值,而是字符串nan
,因此为了ffill
正常工作,您需要将nan
字符串替换为np.nan
:
import numpy as np
df[0] = np.where(df[0] == "NaN", np.nan, df[0])
或者按照@ayhan的建议,在将字符串“NaN”替换为
np.NaN
后,使用df.bfill()
或直接使用.bfill()
?:)@阿汉正是这里需要的人。