Pandas построчная проверка, начинается ли строка элемента со строки из другого элемента (2 разных столбца) - PullRequest
1 голос
/ 30 марта 2020

Я получил файл .csv с 2 столбцами (упрощенно). Один столбец содержит данные, а другой - имя файла. К сожалению, это имя файла может быть неправильным, которое я должен определить, сравнивая дату и имя файла.

Что я хочу

# 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»?

Ответы [ 2 ]

3 голосов
/ 30 марта 2020

Использовать понимание списка с 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
1 голос
/ 30 марта 2020

Выполните:

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

Затем, чтобы сложить, сколько правильных у вас есть:

df['is_correct'].sum()
...