Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 替换dataframe列中的特定值,否则将列转换为数值_Python 3.x_Pandas_Replace - Fatal编程技术网

Python 3.x 替换dataframe列中的特定值,否则将列转换为数值

Python 3.x 替换dataframe列中的特定值,否则将列转换为数值,python-3.x,pandas,replace,Python 3.x,Pandas,Replace,给定以下数据帧 +----+------------------+-------------------------------------+--------------------------------+ | | AgeAt_X | AgeAt_Y | AgeAt_Z | |----+------------------+-----------------------

给定以下数据帧

+----+------------------+-------------------------------------+--------------------------------+
|    |   AgeAt_X        |   AgeAt_Y                           |   AgeAt_Z                      |
|----+------------------+-------------------------------------+--------------------------------+
|  0 |   Older than 100 |                      Older than 100 |                          74.13 |
|  1 |              nan |                                 nan |                          58.46 |
|  2 |              nan |                                 8.4 |                          54.15 |
|  3 |              nan |                                 nan |                          57.04 |
|  4 |              nan |                               57.04 |                            nan |
+----+------------------+-------------------------------------+--------------------------------+
如何用
nan
替换特定列中大于100的

+----+------------------+-------------------------------------+--------------------------------+
|    |   AgeAt_X        |   AgeAt_Y                           |   AgeAt_Z                      |
|----+------------------+-------------------------------------+--------------------------------+
|  0 |              nan |                                 nan |                          74.13 |
|  1 |              nan |                                 nan |                          58.46 |
|  2 |              nan |                                 8.4 |                          54.15 |
|  3 |              nan |                                 nan |                          57.04 |
|  4 |              nan |                               57.04 |                            nan |
+----+------------------+-------------------------------------+--------------------------------+
注释

  • 从所需列中删除大于100的
    字符串后,我将这些列转换为数值,以便对所述列执行计算
  • 在这个dataframe中还有其他列(我从这个示例中排除了这些列),它们不会转换为数值,所以转换为数值必须一次转换一列
我尝试过的

尝试1

if df.isin('Older than 100'):
    df.loc[df['AgeAt_X']] = ''
else:
    df['AgeAt_X'] = pd.to_numeric(df["AgeAt_X"])
尝试2

if df.loc[df['AgeAt_X']] == 'Older than 100r':
    df.loc[df['AgeAt_X']] = ''
elif df.loc[df['AgeAt_X']] == '':
    df['AgeAt_X'] = pd.to_numeric(df["AgeAt_X"])
尝试3次

df['AgeAt_X'] = ['' if ele == 'Older than 100' else df.loc[df['AgeAt_X']] for ele in df['AgeAt_X']]
尝试1、2和3返回以下错误:

KeyError:'没有[0 NaN\n1 NaN\n2 NaN\n3 NaN\n4 NaN\n5 NaN\n6 NaN\n7 NaN\n8 NaN\n9 NaN\n10 NaN\n11 NaN\n12 NaN\n13 NaN\n14 NaN\n17 NaN\n18 NaN\n19 NaN\n20 NaN\n21 NaN\n23 NaN\n25 NaN\n26 NaN\n27 NaN\n28 NaN\n29南\n..\n6332南\n6333南\n6334南\n6335南\n6336南\n6337南\n6338南\n6339南\n6340南\n6341南\n6342南\n6343南\n6344南\n6345南\n6346南\n6347南\n6348南\n6349南\n6350南\n6351南\n6352南\n6353南\n6354南\n6355南\n6356南\n6357南\n6358南\n6359 NaN\n6360 NaN\n6361 NaN\n名称:AgeAt_X,长度:6362,数据类型:float64]在[索引]中'

尝试4次

df['AgeAt_X'] = df['AgeAt_X'].replace({'Older than 100': ''})
尝试4返回以下错误:

TypeError:无法比较类型“ndarray(dtype=float64)”和“str”

我也看了一些帖子,下面的两篇文章实际上并没有替换这个值,而是创建了一个从其他文章派生的新列


如果我理解正确,您可以使用
np.nan
替换所有出现的
大于100的
,只需调用
DataFrame.replace
。如果所有剩余值都是数值,则替换将隐式地将列的数据类型更改为数值

# Minimal example DataFrame
df = pd.DataFrame({'AgeAt_X': ['Older than 100', np.nan, np.nan],
                   'AgeAt_Y': ['Older than 100', np.nan, 8.4],
                   'AgeAt_Z': [74.13, 58.46, 54.15]})
df
          AgeAt_X         AgeAt_Y  AgeAt_Z
0  Older than 100  Older than 100    74.13
1             NaN             NaN    58.46
2             NaN             8.4    54.15

df.dtypes
AgeAt_X     object
AgeAt_Y     object
AgeAt_Z    float64
dtype: object

# Replace occurrences of 'Older than 100' with np.nan in any column
df.replace('Older than 100', np.nan, inplace=True)

df
   AgeAt_X  AgeAt_Y  AgeAt_Z
0      NaN      NaN    74.13
1      NaN      NaN    58.46
2      NaN      8.4    54.15

df.dtypes
AgeAt_X    float64
AgeAt_Y    float64
AgeAt_Z    float64
dtype: object

我们可以循环浏览每一列,检查句子是否存在。如果我们找到了答案,我们将句子替换为
NaN
,并将其转换为数字,在本例中为
float

df.dtypes
AgeAt_X     object
AgeAt_Y     object
AgeAt_Z    float64
dtype: object

sent = 'Older than 100'

for col in df.columns:
    if sent in df[col].values:
        df[col] = df[col].str.replace(sent, 'NaN')
        df[col] = df[col].astype(float)

print(df)
   AgeAt_X  AgeAt_Y  AgeAt_Z
0      NaN      NaN    74.13
1      NaN      NaN    58.46
2      NaN     8.40    54.15
3      NaN      NaN    57.04
4      NaN    57.04      NaN

df.dtypes
AgeAt_X    float64
AgeAt_Y    float64
AgeAt_Z    float64
dtype: object

对于他的例子来说,这是可行的,但在转换为数字时,这是不够的,因为它不会检查每列中是否存在超过100的
。感谢@Peter Leimbigler,您的解决方案确实有效,但Erfan的解决方案也有效,但也减轻了我识别要转换为数字的列的需要,因为如果它们包含的
早于100
,我本来打算转换它们。事实上,不需要显式转换为数字数据类型。如果字符串替换导致一列包含所有数字值,pandas会隐式将该列的数据类型转换为数字类型,在本例中为
float64
。我已经编辑了我的回答以反映此行为。但是,对于包含类似数值和字符串的对象列,
pandas
通常将
1
读入为
'1'
,在这种情况下,它不会得到类型转换(类似
7,8;foo,9等数据)@Alollz,很好的一点,这个示例数据看起来不是这样的,但可能出现在其他列中。感谢@Erfan,这个解决方案为我节省了识别要分别转换为数字的列的步骤。很好的解决方案,但是for循环和
.astype(float)
行是不必要的,因为如果替换结果是包含所有数值的列,pandas会自动将该列转换为数值数据类型。较短的解决方案是
df.replace('Older than 100',np.nan,inplace=True)
是否有任何原因需要在列中保留其他非数值?如果没有,并且结果是
'Older than 100'
是唯一有问题的字符串,那么方法是
pd.to\u numeric(df['col\u name',errors='concure'))
@ALollz,好主意。我会试试这个,明天再报告。谢谢!@ALollz,我相信你的解决方案是目前为止最好的。从文档
中,如果“强制”,则无效解析将设置为NaN
()。这正是我需要的,只需要设置一个参数,不需要额外的代码。谢谢!