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



我有一个很大的 Pandas 数据帧,并希望根据条件替换列子集中的一些值。

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

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

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

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

但是,这给了我错误"不可散列类型:'切片'"。

然后我尝试:

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

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

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

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

谢谢!

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)

我来这里搜索列的一部分,这意味着类似于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

最新更新