代码之家  ›  专栏  ›  技术社区  ›  jovicbg

如果列中包含字符,请更改列类型

  •  3
  • jovicbg  · 技术社区  · 5 年前

    例如,我在某些列(非空对象)中有字符为“%”的值

     col1     col2  col3 
    '4.24%' '5.22%'  8
    

    但是我想要4.24和5.22作为浮动。

    I have tried with:
    for el in df.columns:
        if df[el].str.contains('%').any():
            df[el] = df[el].str.strip("%").astype(float) 
    

    AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

    如果我使用:

    if df['col1'].str.contains('%').any():
                df['col1'] = df['col1'].str.strip("%").astype(float)
    

    那就好了。但是,通过所有列进行迭代是行不通的。

    2 回复  |  直到 5 年前
        1
  •  2
  •   jezrael    5 年前

    您需要先转换为字符串,然后才能 str.contains('%') ,因为它还测试非字符串列:

    for el in df.columns:
        if df[el].astype(str).str.contains('%').any():
            df[el] = df[el].str.strip("%").astype(float) 
    
    print (df)
       col1  col2  col3
    0  4.24  5.22     8
    

    另一个更好的解决方案是使用 select_dtypes 仅适用于select object 列(显然是 string

    for el in df.select_dtypes(object).columns:
        if df[el].str.contains('%').any():
            df[el] = df[el].str.strip("%").astype(float) 
    
        2
  •  1
  •   jpp    5 年前

    如果列包含 '%' 信息技术 必须 object 数据类型。所以你可以用 select_dtypes 首先,应用您的标准,删除 '%' ,然后使用 pd.to_numeric

    Python级别的循环对于每个系列来说都是不可避免的:您可以使用 for 环或 pd.DataFrame.apply apply :

    df = pd.DataFrame({'col1': ['4.24%', '3.65%'],
                       'col2': ['5.22%', '3.56%'],
                       'col3': [8, 9]})
    
    criteria = df.select_dtypes([object]).apply(lambda x: x.str.contains('%').any())
    cols = criteria[criteria].index
    
    df[cols] = df[cols].apply(lambda x: x.str.strip('%'))\
                       .apply(pd.to_numeric)
    
    print(df)
    
       col1  col2  col3
    0  4.24  5.22     8
    1  3.65  3.56     9