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