仅选择包含特定字符的列

时间:2020-09-17 17:13:59

标签: python python-3.x pandas

我最初存储为所有类型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)]

除了这将通过多维键错误为您提供索引

2 个答案:

答案 0 :(得分:3)

这是使用filterselect_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

相关问题