python - 使用 Pandas 进行数据清理
问题描述
我有一个由文本数据组成的数据框列,我需要根据以下条件对其进行过滤:
- 字符“M”,如果它出现在字符串中,它只能在 n-2 位置
- 字符串的 n-1 位置始终必须是“D”。
前任:
KFLL
KSDS
KMDK
MDDL
在这种情况下,例如,我必须删除第一个字符串,因为 n-1 位置的字符不是“D”,最后一个,因为字符“M”出现在 n-2位置。
如何将其应用于整个数据框列?
解决方案
这可以满足您的需求。使用列表推导可能会写得更短,但至少这是可读的。它假定字符串都超过 3 个字符,否则会出现 IndexError。在这种情况下,您需要添加一个 try/except
from collections import Counter
import pandas as pd
df = pd.DataFrame(data=list(["KFLL", "KSDS", "KMDK", "MDDL"]), columns=["code"])
print("original")
print(df)
mask = list()
for code in df["code"]:
flag = False
if code[-2] == "D":
counter = Counter(list(code))
if counter["M"] == 0 or (counter["M"] == 1 and code[-3] == "M"):
flag = True
mask.append(flag)
df["mask"] = mask
df2 = df[df["mask"]].copy()
df2.drop("mask", axis=1, inplace=True)
print("new")
print(df2)
输出看起来像这样
original
code
0 KFLL
1 KSDS
2 KMDK
3 MDDL
new
code
1 KSDS
2 KMDK
推荐阅读
- powershell - 打印变量到控制台打印一个空值
- vba - 异步监听由 Ref 传递的值
- python - 在python中添加到字典时,数组不断被替换
- c++ - boost::stacktrace::safe_dump_to 输出大小
- c++14 - 系统测试 Mongoose 服务器
- javascript - 使用 javascript 更改跨度内容
- c - 我是否错误地使用了“&&”?
- c++ - 从 std::vector 创建张量
价值观 - java - SpringBoot Security - 总是得到错误的凭据
- python - asyncio HTTP 服务器因 keepalive 而挂起