首页 > 解决方案 > 仅选择包含特定字符的列

问题描述

我有一个 df 的数字最初存储为所有类型 str ,有时列中的数据存储为百分比,但它并不总是相同的列。我不知道哪些列将是百分比或数字。如果它存储为百分比,我需要将其转换为小数。

如何找到哪些列是百分比,然后仅将这些列转换为小数

一个例子

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)]

除了这会给你一个多维键错误的索引

标签: pythonpython-3.xpandas

解决方案


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

推荐阅读