我收到了一个包含两列的.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
进行过滤
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]
执行:
df ['is_correct'] = df.apply(lambda x:x ['filename']。startswith(x ['call_date']),axis = 1)
然后,总结您有多少正确答案:
df ['is_correct']。sum()