仅选择包含特定字符的列

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

除此之外,这将为您提供多维键错误的索引


慕村225694
浏览 105回答 2
2回答

翻过高山走不出你

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)/100print (df)  name  date  col1   col2  col3   col40    a  9/17  1.23  0.049   3.0  1.0001    b  9/17  2.00  0.061   5.0  2.5392    c  9/17  6.71  0.079   7.0  0.980

MMTTMM

这可能会让您开始:import numpy as npdef percent_to_float(percent: str) -> float:    return float(percent[:-1])/100df.select_dtype(object).apply(np.vectorize(percent_to_float))   这将获取所有列dtype=object(字符串数据存储在dtype=objectin 中),并应用将百分比字符串(如 )转换为浮点数(如 )的pandas函数。4.5%0.045
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python