【问题标题】:Replacing values greater than a number in pandas dataframe替换熊猫数据框中大于数字的值
【发布时间】:2021-03-28 08:07:08
【问题描述】:

我有一个大数据框,看起来像:

df1['A'].ix[1:3]
2017-01-01 02:00:00    [33, 34, 39]
2017-01-01 03:00:00    [3, 43, 9]

我想用 11 替换每个大于 9 的元素。

因此,上述示例所需的输出是:

df1['A'].ix[1:3]
2017-01-01 02:00:00    [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]

编辑:

我的实际数据框有大约 20,000 行,每行都有大小为 2000 的列表。

有没有办法为每一行使用numpy.minimum 函数?我认为它会比list comprehension 方法更快?

【问题讨论】:

  • 所以值不在列表中?我认为df[df > 9] = 11 解决方案是错误的。还是缺少什​​么?

标签: python database pandas


【解决方案1】:

很简单:df[df > 9] = 11

【讨论】:

  • 解决方案错误,因为没有处理输入数据。
  • 这会返回一个“SettingWithCopyWarning”。
【解决方案2】:

您可以将applylist comprehension 一起使用:

df1['A'] = df1['A'].apply(lambda x: [y if y <= 9 else 11 for y in x])
print (df1)
                                A
2017-01-01 02:00:00  [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]

更快的解决方案是先转换为numpy array,然后使用numpy.where

a = np.array(df1['A'].values.tolist())
print (a)
[[33 34 39]
 [ 3 43  9]]

df1['A'] = np.where(a > 9, 11, a).tolist()
print (df1)
                                A
2017-01-01 02:00:00  [11, 11, 11]
2017-01-01 03:00:00    [3, 11, 9]

【讨论】:

  • 因为数据框非常大,我希望对每一行使用 numpy.minimum 函数,否则速度会相同吗?
  • 列表中总是有3 值?
【解决方案3】:

您可以使用 numpy 索引,通过 .values 函数访问。

df['col'].values[df['col'].values &gt; x] = y

您将任何大于 x 的值替换为 y 的值。

所以对于问题中的示例:

df1['A'].values[df1['A'] &gt; 9] = 11

【讨论】:

  • 这是我能找到的按预期工作的最佳解决方案。
【解决方案4】:

我知道这是一篇旧帖子,但 pandas 现在直接支持DataFrame.where。在您的示例中:

df.where(df <= 9, 11, inplace=True)

请注意,pandas 的 wherenumpy.where 不同。在 pandas 中,当condition == True 时,使用数据框中的当前值。当condition == False时,取其他值。

编辑:

您可以使用Series.where 对一列实现相同的效果:

df['A'].where(df['A'] <= 9, 11, inplace=True)

【讨论】:

    【解决方案5】:

    我来寻求一个解决方案,将每个大于 h 的元素替换为 1 else 0,它有一个简单的解决方案:

    df = (df > h) * 1
    

    (这并不能解决 OP 的问题,因为所有 df

    【讨论】:

    • 如果它不能回答 OP 的问题,你为什么要把它写成答案?
    • 因为标题(导致我和可能的其他人来到这里)不准确,可能暗示这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2019-02-02
    • 2022-06-24
    • 1970-01-01
    • 2016-10-27
    • 2022-01-11
    相关资源
    最近更新 更多