首页 > 解决方案 > 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”列中的字符串开头?

标签: pythonpandasdataframestring-comparison

解决方案


使用列表推导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

推荐阅读