熊猫逐行检查元素字符串是否以其他元素的字符串开头(2个不同的列)

问题描述 投票:0回答: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”列中的字符串开头进行行比较?

python pandas dataframe string-comparison
2个回答
1
投票

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]

0
投票

执行:

df ['is_correct'] = df.apply(lambda x:x ['filename']。startswith(x ['call_date']),axis = 1)

然后,总结您有多少正确答案:

df ['is_correct']。sum()

© www.soinside.com 2019 - 2024. All rights reserved.