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 中将行中的最大值设置为 1,其余设置为 0