为了账号安全,请及时绑定邮箱和手机立即绑定

仅选择包含特定字符的列

仅选择包含特定字符的列

慕村225694 2023-08-15 17:30:20
我有一个最初存储为所有类型 str 的数字 df ,有时列中的数据存储为百分比,但并不总是相同的列。我不知道哪一列是百分比还是数字。如果它存储为百分比,我需要将其转换为小数。如何找到哪些列是百分比,然后仅将这些列转换为小数一个例子name  date  col1  col2  col3  col4a     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  col4a     9/17  1.23  0.049 3.00  1.00b     9/17  2.00  0.061 5.00  2.539c     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 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超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


查看完整回答
反对 回复 2023-08-15
?
MMTTMM

TA贡献1869条经验 获得超4个赞

这可能会让您开始:


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=objectin 中),并应用将百分比字符串(如 )转换为浮点数(如 )的pandas函数。4.5%0.045


查看完整回答
反对 回复 2023-08-15
  • 2 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信