Pandas:如何将列(坏数据)中的太大值设置为零,我应该使用 if 函数还是完全不同的东西? [复制]

Posted

技术标签:

【中文标题】Pandas:如何将列(坏数据)中的太大值设置为零,我应该使用 if 函数还是完全不同的东西? [复制]【英文标题】:Pandas: How to set too large values in columns (bad data) to zero, should I use an if function or something completely different? [duplicate] 【发布时间】:2019-05-12 08:51:15 【问题描述】:

Pandas 数据框“power”将日期时间作为索引。列是具有 float64 值的 Ap1、Ap2、Ap3 和 Solar。但是,有些数据不好,我想用零替换某个值(例如 100 000)以上的所有值。以下是数据框的外观:

power.head()
power.describe()

                    Ap1     Ap2     Ap3     Solar
Datetime                
2018-01-01 00:00:00 659.18  59.51   120.39  0.0
2018-01-01 00:01:00 600.59  119.93  179.90  0.0
2018-01-01 00:02:00 600.59  119.93  119.93  0.0
2018-01-01 00:03:00 534.67  119.93  59.97   0.0
2018-01-01 00:04:00 600.59  119.93  119.93  0.0


    Ap1             Ap2             Ap3             Solar
max 6.489067e+06    1.167420e+06    2.296201e+06    52433.040000

我正在尝试使用 if 函数遍历列,该函数将用零替换大值

def badvalue(x):
    if x > 100000:
        x == 0

power["Ap1"].apply(badvalue)

但是,这对数据没有任何作用,而且我知道您可能无论如何都无法以这种方式更改值(但我希望 Pandas 如此直观!)。 那么使用 Pandas 最简单/最好的方法是什么?

如果我想同时对所有列而不是只对一列执行此操作,该方法会有所不同吗?

感谢您的帮助。

【问题讨论】:

您的代码的问题在于您没有将其分配给任何东西。这样你的代码应该可以工作:power["Ap1"] = power["Ap1"].apply(badvalue) 但这可以在 pandas 中更有效地完成:power.loc[power["Ap1"] > 10000, "Ap1"] = 0 谢谢你,后一个例子正是需要的。只是出于好奇,您知道为什么评论中的第一个示例将列中的每个值都更改为“无”吗? 你的函数 badvalue 没有 return 任何东西(我之前没有注意到)。如果将return x 添加到函数底部,它可能会按预期工作。 我之前也试过用 return x ,但它仍然没有正确。不过没关系,从现在开始我会用.loc来做,再次感谢。 【参考方案1】:

用途:

power.Ap1[power.Ap1 > 10000] = 0

对于其他列也是如此。

【讨论】:

使用 df.loc[] 更改值是首选。 谢谢。你能把我引到这样的比较来源吗:) 只看运行代码时得到的警告:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy ''' 我在运行代码后粘贴了答案,没有任何警告。无论如何,我也很感激loc :) 你是对的,我的错。我做了不同的事情。

以上是关于Pandas:如何将列(坏数据)中的太大值设置为零,我应该使用 if 函数还是完全不同的东西? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将列的子集设置为相同的 dict 值

如何将 Pandas 数据框中的负数替换为零

在 pandas 中将行中的最大值设置为 1,其余设置为 0

Pandas - 将列值组合到新列中的列表中

Python/Pandas/Datetime:将列中的整个列表转换为日期时间

将列转换为时间戳 - Pandas Dataframe