用列多索引(df.fillna)在数据框中仅将一列的“ NaN”值替换为最后一个有效值

时间:2018-12-11 22:38:28

标签: python pandas dataframe multi-index fillna

我正在使用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)

但是我收到此错误“正在尝试从DataFrame的切片副本上设置一个值”

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

有人有帮助我的想法吗?

1 个答案:

答案 0 :(得分:1)

经过一番挖掘,我发现有一种更合适的方式来引用我们要专门编辑的列。请查看How to deal with SettingWithCopyWarning in Pandas?,以了解更多信息。另一个资源: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。我不确定最后一个有效值的含义。