如果列在熊猫中包含字符,则更改列类型

时间:2018-12-12 12:19:03

标签: python pandas

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

 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 个答案:

答案 0 :(得分:2)

您需要转换为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仅选择object列(显然是string个):

for el in df.select_dtypes(object).columns:
    if df[el].str.contains('%').any():
        df[el] = df[el].str.strip("%").astype(float) 

答案 1 :(得分:1)

如果列包含'%',则必须object dtype。因此,您可以先使用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