pythonpands:如果有列值是NaN,如何在层次索引中删除特定级别?

2024-04-18 19:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

如果某个国家的数据值是NaN,我希望在我的分层索引中删除整个级别(在本例中是国家)。所以我想从这个开始:

                          M1                   M2
country    year                                   
Arab World 2010           5.240002             NaN
           2009           NaN                  NaN
Bangladesh 2010           6.206065             3.7
           2009           5.708707             NaN
Canada     2010           7.203803             5.8
           2009           6.144833             7.0
Sweden     2010           9.123140             6.0
           2009           5.213283             6.1

像这样的事情:

^{pr2}$

我尝试了df.dropna()thresh选项,以及df.fillna(0)来尝试简化删除国家的操作,但是这两种方法都是为了在M1和M2包含值的情况下在数据框中保留级别,例如2010年的孟加拉国。在

有什么简明的方法来解决这个问题吗?在


Tags: 数据方法dfworld分层国家nan级别
2条回答

是的,有一个简洁有效的方法来解决这个问题。您使用df.dropna()是正确的,只是在应用数据之前需要unstack您的数据。在

>>> print df

                       M1   M2
Country    Year               
Arab World 2009       NaN  NaN
           2010  5.240002  NaN
Bangladesh 2009  5.708707  NaN
           2010  6.206065  3.7
Canada     2009  6.144833  7.0
           2010  7.203803  5.8
Sweden     2009  5.213283  6.1
           2010  9.123140  6.0

旋转DataFrame使“Year”成为最内层的列标签

^{pr2}$

删除缺少数据的行

>>> df2 = df1.dropna()  

反装拆垛

>>> print df2.stack()

                    M1   M2
Country Year               
Canada  2009  6.144833  7.0
        2010  7.203803  5.8
Sweden  2009  5.213283  6.1
        2010  9.123140  6.0

把这些放在一起:

>>> clean = df.unstack(level=-1).dropna().stack()

代码块底部的三行完成了繁重的工作,剩下的几行将数据放入数据帧(或多或少)。在

# get data
data="""
country    year           M1                   M2 
Arab_World 2010           5.240002             NaN
Arab_World 2009           NaN                  NaN
Bangladesh 2010           6.206065             3.7
Bangladesh 2009           5.708707             NaN
Canada     2010           7.203803             5.8
Canada     2009           6.144833             7.0
Sweden     2010           9.123140             6.0
Sweden     2009           5.213283             6.1"""
from StringIO import StringIO # import from io for python 3
df = pd.read_csv(StringIO(data), header=0, index_col=['country', 'year'], sep=r'\s+')

# manipulate rows
to_drop = df.groupby(level='country').apply(lambda x: x.isnull().any().any())
df = df.reset_index(level=0)
keepers = df[(~to_drop[df.country]).tolist()]

收益率

^{pr2}$

相关问题 更多 >