Python 3.x 当列数未知时,替换数据帧中特定列中的值

Python 3.x 当列数未知时,替换数据帧中特定列中的值,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我是Python和stacks exchange的新手。我一直试图在特定列中用np.nan替换无效值(x12) 我不知道需要处理多少列,因此必须创建一个考虑到这一点的通用代码。但是我知道,前两列分别是id和name。我在google和stacks exchange上搜索了一个解决方案,但没有找到一个解决我具体目标的解决方案 我的问题是,;如何替换第三列及以后的值 我的数据框看起来像这样 我试过这句话: Data[Data > 12.0] = np.nan. Data[(Data.ilo

我是Python和stacks exchange的新手。我一直试图在特定列中用np.nan替换无效值(x12)

我不知道需要处理多少列,因此必须创建一个考虑到这一点的通用代码。但是我知道,前两列分别是id和name。我在google和stacks exchange上搜索了一个解决方案,但没有找到一个解决我具体目标的解决方案

我的问题是,;如何替换第三列及以后的值

我的数据框看起来像这样

我试过这句话:

Data[Data > 12.0] = np.nan.
Data[(Data.iloc[(range(2,Columns))] >=12) & (Data.iloc[(range(2,Columns))]<=-3)] = np.nan
这将前两列替换为nan

我试过这句话:

Data[Data > 12.0] = np.nan.
Data[(Data.iloc[(range(2,Columns))] >=12) & (Data.iloc[(range(2,Columns))]<=-3)] = np.nan
替换第2行到第6行(第7列)中的所有值显然是错误的

任何想法都将不胜感激


达尔文上的Python 3.6.1 64位、Qt5.6.2、PyQt5 5.6

您正在寻找
applymap()
方法

import pandas as pd
import numpy as np

# get the columns after the second one
cols = Data.columns[2:]

# apply mask to those columns
new_df = Data[cols].applymap(lambda x: np.nan if x > 12 or x <= -3 else x)
将熊猫作为pd导入
将numpy作为np导入
#获取第二列之后的列
cols=Data.columns[2:]
#对这些列应用掩码

new_df=Data[cols].applymap(lambda x:np.nan如果x>12或x,则可以通过使用和切片所需的列来为数据帧的特定列设置值。然后,我们可以使用

使用一些随机数据的一个简短示例

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
设置要更新的区域和要更新的区域,并将索引为2的列切片到最后一列

df.iloc[:,2:] = df.iloc[:,2:].where((df < 7) & (df > 2))

对于您的数据,代码如下

Data.iloc[:,2:] = Data.iloc[:,2:].where((Data <= 12) & (Data >= -3))
因此,数据是在有条件的基础上进行检查的


Data=12

不需要使用
iloc
来获取列名。您可以简单地使用
cols=Data.columns[2:][/code>这起到了部分作用,它替换了无效值,但分割了数据帧。“new_df”dataframe只包含值,不包含所需的ID和名称列
合并数据帧,得到我最初想要的结果。是否要替换这些值并保持原始数据帧?我假设我必须用-3和12替换7和2,以达到我想要的范围。但是当我这样做时,上面的代码会用NaN替换所有值。这显然对我不起作用,但我很抱歉不熟悉Python,不一定知道我在做什么..用12替换7,用-3替换2..我认为你的操作是向后的。还要适当地更改运算符。很抱歉,我在回答中添加了一些信息。它起作用了!但为什么是“(数据<12)和(数据>-3)”而不是“(数据<-3)和(数据>12)“?这让我很困惑,我在寻找高于12而低于-3的值。此外,这是否只适用于想用NaN替换的情况,如果我想用let say x替换它们呢?啊!这很有意义,我添加了一个快速解释来解释执行该逻辑运算的正确方法。您也可以添加
。fillna('x'))
在这一行的结尾,我们有一些简单明了的解释!非常感谢!
Data.iloc[:,2:] = Data.iloc[:,2:].where((Data >= 12) | (Data <= -3))