我最初存储为所有类型str的数字df,有时列中的数据以百分比形式存储,但它并不总是相同的列。我不知道哪些列将是百分比或数字。如果将其存储为百分比,则需要将其转换为小数。
如何查找哪些列为百分比,然后仅将这些列转换为小数
一个例子
name date col1 col2 col3 col4
a 9/17 1.23 4.90% 3.00 100.00%
b 9/17 2.00 6.10% 5.00 253.90%
c 9/17 6.71 7.90% 7.00 98.00%
所需的输出:
name date col1 col2 col3 col4
a 9/17 1.23 0.049 3.00 1.00
b 9/17 2.00 0.061 5.00 2.539
c 9/17 6.71 0.079 7.00 0.98
我尝试过
df=df.apply(pd.to_numeric, errors="ignore")
df.iloc[:,2:]=df.iloc[:,2:].apply(lambda x: x.str.strip('%').astype(float)/100, axis=1)
但是,这会将所有float类型的列设置为nan。如果列开头都是str类型,那么第二行会将所有值除以100,这是我不希望的。因此,我只需要查找和选择具有%
的整个列类似
df.loc[:,df.apply(lambda x: x.str.contains("%"), axis=1)]
除了这将通过多维键错误为您提供索引
答案 0 :(得分:3)
这是使用filter
和select_dtypes
查找列的一种方法:
cols = df.filter(like="col").select_dtypes("object").columns
或者,您可以提取1行并找到%
:
cols = df.columns[df.loc[0].astype(str).str.endswith("%")]
两者都会为您获取列名。
df[cols] = df[cols].replace("%", "", regex=True).astype(float)/100
print (df)
name date col1 col2 col3 col4
0 a 9/17 1.23 0.049 3.0 1.000
1 b 9/17 2.00 0.061 5.0 2.539
2 c 9/17 6.71 0.079 7.0 0.980
答案 1 :(得分:0)
这可能会让您入门:
import numpy as np
def percent_to_float(percent: str) -> float:
return float(percent[:-1])/100
df.select_dtype(object).apply(np.vectorize(percent_to_float))
这将使用所有带有dtype=object
的列(字符串数据存储在dtype=object
中的pandas
中,并应用一个函数来将百分比字符串(如4.5%
转换为浮点数) 0.045
。