Python - подсчет не алфавитно-цифровых символов в кадре данных Pandas - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь подсчитать вхождения символов в столбце в кадре данных Pandas.Например, я хочу узнать, сколько раз символ A появляется в столбце.Проблема возникает, когда есть не буквенно-цифровой символ.

Вот минимальный воспроизводимый пример:

import pandas as pd
df = pd.DataFrame(data = ['AA', 'BA', 'ABA'], columns = ['col1'])
charset = set("".join(list(df['col1'])))
print(charset)

Это набор символов в столбце:

{'B', 'A'}
for char in charset:
    print(char, ' ', sum(df['col1'].str.count(char)))

Это число раз, которое каждыйв столбце появляется символ:

B   2
A   5

Попытка повторить то же самое, за исключением нескольких не алфавитно-цифровых символов:

df2 = pd.DataFrame(data = ['AA+', 'BA', 'ABA('], columns = ['col1'])
charset = set("".join(list(df2['col1'])))
print(charset)

Как и ожидалось, набор символов:

{'(', 'B', '+', 'A'}

Однако попытка подсчитать символы теперь не удалась:

for char in charset:
    print(char, ' ', sum(df2['col1'].str.count(char)))
error: missing ), unterminated subpattern at position 0

Есть ли какой-нибудь способ экранировать не алфавитно-цифровые символы или иным образом получить счетчик, который я ищу?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2019

Поскольку ввод в Series.str.count является регулярным выражением, возможно использование re.escape:

pat : str

Действительныйрегулярное выражение.

df2 = pd.DataFrame(data = ['AA+', 'BA', 'ABA('], columns = ['col1'])
#list is not necessary
charset = set("".join(df2['col1']))
print(charset)
{'(', 'B', 'A', '+'}

import re
for char in charset:
    #used pandas sum
    print(char, ' ', df2['col1'].str.count(re.escape(char)).sum())

(   1
B   2
A   5
+   1
0 голосов
/ 22 сентября 2019

Немного расширяя то, что вы уже сделали, вы можете использовать условное словарное понимание, чтобы проверить, что каждый символ в charset является буквой ASCII.

from string import ascii_letters

>>> {char: df['col1'].str.count(char).sum() for char in charset
    if char in ascii_letters}
    {'B': 2, 'A': 5}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...