首页 > 解决方案 > 用列多索引(df.fillna)将数据框中仅一列的“NaN”值替换为最后一个有效值

问题描述

我正在使用 Python 3.6.5。

这是一个小脚本,用于生成具有一些“NaN”值的多索引数据帧。

import pandas as pd
import numpy as np

att_1 = ['X', 'Y']
att_2 = ['a', 'b']

df_1 = pd.DataFrame(np.random.randint(10,19,size=(5, 2)), columns=att_2, 
index=[10,20,30,35,40])
df_2 = pd.DataFrame(np.random.randint(20,29,size=(5, 2)), columns=att_2, 
index=[20,25,40,50,80])

# Concat df with new key dimension for column attribute
df = pd.concat([df_1, df_2], keys=att_1, axis=1)

我得到这个数据框

print(df)
       X           Y      
       a     b     a     b
10  17.0  17.0   NaN   NaN
20  15.0  11.0  20.0  28.0
25   NaN   NaN  23.0  24.0
30  12.0  16.0   NaN   NaN
35  10.0  10.0   NaN   NaN
40  15.0  14.0  25.0  28.0
50   NaN   NaN  22.0  22.0
80   NaN   NaN  23.0  21.0

我想用最后一个有效值替换“NaN”值,但仅限于一列。例如,我想得到这个(对于名为'X','b'的列)

print(df)
       X           Y      
       a     b     a     b
10  17.0  17.0   NaN   NaN
20  15.0  11.0  20.0  28.0
25   NaN  11.0  23.0  24.0
30  12.0  16.0   NaN   NaN
35  10.0  10.0   NaN   NaN
40  15.0  14.0  25.0  28.0
50   NaN  14.0  22.0  22.0
80   NaN  14.0  23.0  21.0

我试过这个:

# Replace NaN value by last valid value for column named 'X','b'
df['X']['b'].fillna(method='ffill', inplace=True)

但我收到此错误“试图在数据帧的切片副本上设置一个值”

对于具有多列索引的数据框,我找不到任何解决方案。我发现这个链接让我没有希望。(https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.MultiIndex.fillna.html

有人有想法可以帮助我吗?

标签: pythonpandasdataframemulti-indexfillna

解决方案


经过一番挖掘,我发现有一种更合适的方式来引用我们要专门编辑的列。检查如何处理 Pandas 中的 SettingWithCopyWarning?了解更多信息。另一个资源: http: //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

建议我们使用.loc更改列。使用下面的行删除了所有错误。

df.loc[df['X']['b'].isnull(), ('X', 'b')] = df['X']['b'].ffill()

但是,在这里我使用列的最大值来替换每个NaN。我不确定最后一个有效值是什么意思。


推荐阅读