python - Pandas 按行检查元素字符串是否以其他元素的字符串开头(2 个不同的列)
问题描述
我收到了一个包含 2 列(简化)的 .csv 文件。一列包含数据,另一列包含文件名。不幸的是,这个文件名可能不正确,我必须通过比较日期和文件名来确定。
我想要的是
# initial situation
d = {
'call_date': ["20200102-09", "20191203-04", "20200103-10"],
'filename': ["20200102-09xx.wav", "20200102-10yy.wav", "20200103-10zz.wav"]
}
df = pd.DataFrame(data=d)
print(df)
# call_date filename
# 0 20200102-09 20200102-09xx.wav
# 1 20191203-04 20200102-10yy.wav
# 2 20200103-10 20200103-10zz.wav
...
# desired result
print(pd.Series([True, False, True]))
# 0 True
# 1 False
# 2 True
# dtype: bool
使用所需的结果,我可以计算我有多少错误文件,并将 DataFrame 过滤为仅包含有效条目。
我试过的
通常,比较会像这样进行:
# True / False
df["call_date"] == df["filename"]
# filter DF
df[df["call_date"] == df["filename"]]
Pandas 有一个pandas.Series.str.startswith函数,但它仅适用于单个字符串,不适用于以下内容:
df["filename"].str.startswith(df["call_date"])
# 0 NaN
# 1 NaN
# 2 NaN
# Name: filename, dtype: float64
问题
如何按行比较“文件名”列中的元素是否以“call_date”列中的字符串开头?
解决方案
使用列表推导startswith
- 输出是列表,可用于过滤boolean indexing
m = [x.startswith(y) for x, y in df[['filename','call_date']].values]
或者:
m = [x.startswith(y) for x, y in zip(df['filename'], df['call_date'])]
print (m)
[True, False, True]
另一种解决方案,但速度较慢:
m = df.apply(lambda x: x['filename'].startswith(x['call_date']), axis=1)
print (m)
0 True
1 False
2 True
dtype: bool
推荐阅读
- javascript - 比较两个未知格式的日期
- unity3d - 带有过渡的动画不在统一场景中开始
- linux - 如何在linux中增加文件描述符的大小
- openiddict - openiddict asp.net 核心 OpenIdConnectRequest 参数
- python - 如果socketIO实例是类成员变量,如何用flask-socketio装饰类函数?
- docker - 在 docker-compose 中构建两个容器之一后,有没有办法运行命令
- html - 如何禁用将自定义用户文本输入到 Rails form.select f
- android - 我无法在 SQLite 中保存没有重复的记录
- ruby-on-rails - 在 Rails 中从一个应用程序调用控制器操作到另一个应用程序
- google-cloud-platform - 无法连接到 Google Cloud Platform 上的 ssh: