首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Pandas Fillna中值不工作

Python Pandas Fillna中值不工作
EN

Stack Overflow用户
提问于 2018-03-06 17:52:27
回答 2查看 16.6K关注 0票数 8

我正在尝试填充包含多列和多行的数据帧中的所有nans。我使用它来训练一个多变量ML模型,所以我想用中值填充每一列的nans。为了测试median函数,我这样做:

代码语言:javascript
复制
training_df.loc[[0]] = np.nan # Sets first row to nan
print(training_df.isnull().values.any()) # Prints true because we just inserted nans
test = training_df.fillna(training_df.median()) # Fillna with median
print(test.isnull().values.any()) # Check afterwards

但是当我这样做的时候什么都没有发生,最后一行的print仍然返回True。如果我尝试改为使用median函数,则如下所示:

代码语言:javascript
复制
training_df.fillna(training_df.median(), inplace=True)

什么也不会发生。如果我这样做:

代码语言:javascript
复制
training_df = training_df.fillna(training_df.median(), inplace=True)

Training_df将变为none。我该如何解决这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 18:09:20

正如@thesilkworm建议的那样,首先将您的序列转换为数字。下面是一个最小的例子:

代码语言:javascript
复制
import pandas as pd, numpy as np

df = pd.DataFrame([[np.nan, np.nan, np.nan],
                   [5, 1, 2, 'hello'],
                   [1, 4, 3, 4],
                   [9, 8, 7, 6]], dtype=object)

df = df.fillna(df.median())  # fails

df[df.columns] = df[df.columns].apply(pd.to_numeric, errors='coerce')

df = df.fillna(df.median())  # works
票数 16
EN

Stack Overflow用户

发布于 2021-10-19 16:51:40

您可以使用np.nanmedian +字典理解来重命名。

代码语言:javascript
复制
df = pd.DataFrame({"col1": [1,2,np.nan,3], "col2": [5, np.nan, 10, np.nan]})

col_map = {df.columns.get_loc(col):col for col in df.columns} # {0: "col1", 1: "col2"}
median_values = pd.Series(np.nanmedian(df, axis=0)).rename(col_map)
df = df.fillna(median_values)

>> df
   col1 col2
0   1.0 5.0
1   2.0 7.5
2   2.0 10.0
3   3.0 7.5

您可以看到,在jpp的回答中,在.apply()之后调用df.median()的间歇性步骤与我在上面定义的median_series相同。

代码语言:javascript
复制
print(df.median()) # after .apply()
col1    2.0
col2    7.5
dtype: float64

print(median_series)
col1    2.0
col2    7.5
dtype: float64

注意:如果您的df中的一个值是像"hi“这样的字符串,那么使用np.nanmedian将会出现错误,这是我们在生产中经常需要的。

解释:在大多数情况下,我仍然喜欢jpp的答案,但有时如果我的数据量很大,或者我正在向ML端点发送数据,我不想使用errors='coerce'覆盖所有东西,而do希望返回错误。想象一下6个月后投入生产的场景,您的一些col1值将作为字符串进行传递:[1, 2, 'hi', 'bye']。使用errors=coerce会将hi & bye设置为NaN。您将不会意识到字符串正在从您没有进行的一些上游更改泄漏到列中,并且您的ML算法会像正常一样传递分数,但实际上它只是给一大堆NaNs评分。你的模型性能会在不知道原因的情况下下降,实际上这是一个很好的模型,它只是没有根据正确的数据进行评分。公司亏了钱,你就被解雇了。我意识到我偏离了一个不太可能的滑坡路,但我想强调一下重点。

如果在prod:中,我们想要此错误:

代码语言:javascript
复制
df = pd.DataFrame({"col1": [1,2,np.nan,'hi'], "col2": [5, np.nan, 10, np.nan]})
col_map = {df.columns.get_loc(col):col for col in df.columns} # {0: "col1", 1: "col2"}
median_series = pd.Series(np.nanmedian(df, axis=0)).rename(col_map)
>> TypeError: ufunc 'isnan' not supported for the input types, and the inputs 
could not be safely coerced to any supported types according to the casting rule ''safe''
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49127897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档