将 pandas 数据框中的列切片中的值替换为基于条件的值

问题描述 投票:0回答:2

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

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

由于数据帧太大,并且行数和列数随着时间的推移而不断增长,因此我无法手动指定要更改值的列的名称。相反,我只需要指定应检查第 10 列及更高列值 > 1。

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

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

但是,这给了我错误“unhashable type: ‘slice’”。

然后我尝试了:

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

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

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

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

谢谢!

python pandas dataframe conditional-statements slice
2个回答
2
投票

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)

0
投票

我来这里寻找柱子的切片,这意味着类似

df.loc[10:, column_name]
的东西。如果索引不是范围索引,则需要将
5:100
替换为
df.index
。这是我的解决方案(经过一些试验和错误)基于这个答案

idx = df.loc[:, data_name].index[10:]  # get index
df.loc[idx, data_name] = 1  # replace
© www.soinside.com 2019 - 2024. All rights reserved.