【问题标题】:Replace values in a slice of columns in a pandas dataframe with a value based on a condition用基于条件的值替换熊猫数据框中的列切片中的值
【发布时间】:2021-07-14 18:51:21
【问题描述】:

我有一个大的 Pandas 数据框,并且想根据条件替换列子集中的一些值。

具体来说,我想在第 9 列右侧的每一列中将大于 1 的值替换为 1。

由于数据框太大并且随着时间的推移行数和列数都在增长,我无法手动指定要更改值的列的名称。相反,我只需要指定第 10 列和更大的列应该是检查值 > 1。

在查看了许多不同的 Stack Overflow 帖子和 Pandas 文档后,我尝试了:

df.iloc[df[:,10: ] > 1] = 1

但是,这给了我错误“不可散列的类型:'sl​​ice'”。

然后我尝试了:

df[df.iloc[:, 10:] > 1] = 1

df[df.loc[:, df.columns[10:]] > 1] = 1

根据 cmets 中的 2 条建议,但这两个都给了我错误“无法对具有非 np.nan 值的混合类型进行就地布尔设置”。

有谁知道我为什么会收到这些错误和/或我应该对我的代码进行哪些更改以避免这些错误?

谢谢!

【问题讨论】:

  • 检查df[df.iloc[:, 10:] > 1] = 1
  • 现在我得到错误“‘int’对象没有属性‘iloc’”。 @ShubhamSharma
  • df[df.loc[:, df.columns[10:]] > 1] = 1 呢?
  • 请检查df的类型,即type(df),它应该是pandas.core.frame.DataFrame。我猜你已经用整数值覆盖了变量df
  • 啊,是的,我不小心把它改写了。当我修复它并从您的第一条评论运行您的代码时,我现在收到错误“无法对具有非 np.nan 值的混合类型进行就地布尔设置。”这是因为我的前 9 列是字符串和整数的混合,我无法更改数据框。 @ShubhamSharma 你有什么建议吗?我不想用堆叠来解决这个问题。

标签: python pandas dataframe conditional-statements slice


【解决方案1】:

1。 DataFrame.where

我们可以使用iloc选择9th列右侧的所有列,然后使用where我们可以替换条件x.le(1)False的数据框切片中的值。

df.iloc[:, 10:] = df.iloc[:, 10:].where(lambda x: x.le(1), 1)

2。 DataFrame.clip

或者,我们可以使用clip,我们可以将upper 限制定义为1,它将数据帧切片中大于1 的所有值分配给1

df.iloc[:, 10:] = df.iloc[:, 10:].clip(upper=1)

【讨论】:

  • 你能解释一下这些选项的作用吗?我不熟悉 clip 或 lambda。
  • @jmrpink 给我一分钟已经添加解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2019-02-02
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2018-10-18
相关资源
最近更新 更多