我正在使用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)
有人有帮助我的想法吗?
答案 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
。我不确定最后一个有效值的含义。