我在某些列(非空对象)中具有字符“%”的值,例如
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)
然后工作正常。但是遍历所有列都无法正常工作。
欢迎任何帮助。
答案 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