替换Pandas Dataframe中特定列的值,当列数未知时

3

我是新手,对Python和Stack Exchange不太熟悉。我一直在尝试将特定列中的无效值 (x<-3和x>12) 替换为np.nan。

我不知道要处理多少列,因此必须创建一个通用代码来解决这个问题。但我知道,前两列分别是id和名称。我已经在Google和Stack Exchange上搜索了解决方案,但没有找到解决我的具体问题的解决方案。

我的问题是:如何替换第三列及以后发现的值?

我的数据框看起来像这样;

数据

我尝试了这行代码:

Data[Data > 12.0] = np.nan.

这将使用nan替换了前两列

第一次尝试

我尝试了这行代码:

Data[(Data.iloc[(range(2,Columns))] >=12) & (Data.iloc[(range(2,Columns))]<=-3)] = np.nan

在这里,

Columns = len(Data.columns)

明显是错误的,将行2到6所有值替换为(列=7)。

第二次尝试

非常感谢您的任何想法。

Python 3.6.1 64位,Qt 5.6.2,PyQt5 5.6 在 Darwin 上。

2个回答

3

2
不必使用 iloc 来获取列名。你可以直接使用 cols= Data.columns[2:] - DJK
这部分代码起到了一定的作用,它替换了无效值但切片了数据框。"new_df" 数据框只包含值,而不包含所需的 Ids 和 Names 列。我使用 pd.concat([Ids, Names, new_df], axis=1) 合并数据框,得到了最初想要的结果。有没有办法替换这些值并保持原始数据框? - J.Doe

2
您可以使用iloc来切片需要的列,并设置数据框的特定列的值。然后,我们可以使用where函数进行赋值。
以下是一个使用随机数据的简短示例。
df = pd.DataFrame(np.random.randint(0,10,(4,10)))


   0  1  2  3  4  5  6  7  8  9
0  7  7  9  4  2  6  6  1  7  9
1  0  1  2  4  5  5  3  9  0  7
2  0  1  4  4  3  8  7  0  6  1
3  1  4  0  2  5  7  2  7  9  9

现在我们使用 iloc 将要更新的区域和我们想要更新的区域进行设置,并且对从第二列索引到最后一列索引的列进行切片。
df.iloc[:,2:] = df.iloc[:,2:].where((df < 7) & (df > 2))

这将会把数据框中的值设置为NaN

   0  1    2    3    4    5    6   7    8   9
0  7  7  NaN  4.0  NaN  6.0  6.0 NaN  NaN NaN
1  0  1  NaN  4.0  5.0  5.0  3.0 NaN  NaN NaN
2  0  1  4.0  4.0  3.0  NaN  NaN NaN  6.0 NaN
3  1  4  NaN  NaN  5.0  NaN  NaN NaN  NaN NaN

对于您的数据,代码应为:

Data.iloc[:,2:] = Data.iloc[:,2:].where((Data <= 12) & (Data >= -3))

操作符澄清

我展示的设置直接如上所示,会像这样:

-3 <= 数据 <= 12表示这些数字之间的所有内容

如果我们使用 & 操作符反转这个逻辑,它看起来像这样:

-3 >= 数据 <= 12一个数字不能同时小于-3和大于12。

因此我们使用或操作符 |。代码现在看起来像这样...

Data.iloc[:,2:] = Data.iloc[:,2:].where((Data >= 12) | (Data <= -3))

因此,数据是基于条件进行检查的。

Data <= -3 或 Data >= 12


我认为我需要用-3和12替换7和2以达到我想要的范围,但是当我这样做时,上面的代码将所有值替换为NaN。显然这对我不起作用,但我是Python的新手,不一定知道自己在做什么。 - J.Doe
1
将7替换为12,将2替换为-3。我认为你搞反了。还要适当更改运算符。对于混淆,我已经添加了一些信息到答案中。 - DJK
它起作用了!但为什么是“(Data < 12) & (Data > -3)”而不是“(Data < -3) & (Data > 12)”?这让我感到困惑,因为我正在寻找大于12和小于-3的值。此外,如果我想用x替换它们,而不是NaN,这种方法是否仍然适用? - J.Doe
1
啊!那很有道理。我添加了一个简短的解释来说明正确执行逻辑操作的方法,你还可以在那行代码的末尾加上.fillna('x') - DJK
1
太棒了,解释得非常清晰!非常感谢! - J.Doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接