python - 仅选择包含特定字符的列
问题描述
我有一个 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)]
除了这会给你一个多维键错误的索引
解决方案
这是使用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
推荐阅读
- kotest - 如何在 Kotest 的另一台发电机中使用一台发电机的输出?
- php - 如何在php中将数组合并为单个数组?
- python - ValueError: x 和 y 必须具有相同的第一维,但具有形状 (50,) 和 (1, 50)/ 多处理
- monaco-editor - 覆盖摩纳哥编辑器悬停小部件样式以隐藏“偷看问题”
- go - go-swagger:没有可用于解组的规范
- python - 在 Python 中的 mysql 连接中出现错误
- javascript - 删除显示的项目列表的问题
- python - 格式不显示
- c# - 如何仅过滤和搜索选定字段并排除 ASP.NET MVC 中的空文本框
- mysql - 使用 Intellij 通过 kubernetes pod 连接到 MySQL 服务器