python - 用列多索引(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)
有人有想法可以帮助我吗?
解决方案
经过一番挖掘,我发现有一种更合适的方式来引用我们要专门编辑的列。检查如何处理 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
。我不确定最后一个有效值是什么意思。
推荐阅读
- python - 无法将字符串转换为整数python3
- javascript - 通过操作系统自动访问默认浏览器并将值从输入字段复制到我的程序
- powershell - 尽管 Find-Module 工作正常,PowerShellGet 在 Install-Module 上“找不到包源”
- multithreading - 使用不同的信号量同步线程(客户端)
- java - 如何将矩阵中的元素设置为空白“”,而不是默认的“null”
- django - 我正在获取需要手动验证的用户数据,然后在手动验证后将其发送到 django 模型以保存在数据库中
- python - 使用 Visual Studio Code 将数据导入 SQL Server
- scrapy - ModuleNotFoundError:没有名为“home”的模块导入scrapy设置
- amazon-web-services - 如何解决 snowSQL 中的登录问题
- c# - 有什么方法可以根据多个表中的多个位置检索数据