Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于多索引的填充NaN_Python_Pandas - Fatal编程技术网

Python 基于多索引的填充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

我有一个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','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()
?:)@阿汉正是这里需要的人。