Разделение строк в кортежах в столбце данных pandas - PullRequest
0 голосов
/ 23 января 2019

У меня есть датафрейм pandas, где столбец содержит кортежи:

p = pd.DataFrame({"sentence" : [("A.Hi",   "B.My",   "C.Friend"), \
                                ("AA.How", "BB.Are", "CC.You")]})

Я хотел бы разбить каждую строку в кортеже на пунктуацию ., взять вторую часть split / string и посмотреть, сколько совпадений в списке строк:

p["tmp"] = p["sentence"].apply(lambda x: [i.split(".")[1] for i in x])
p["tmp"].apply(lambda x: [True if len(set(x).intersection(set(["Hi", "My"])))>0 else False])

Это работает как задумано, но мой фрейм данных содержит более 100 тыс. Строк - и apply не кажется очень эффективным при таких размерах. Есть ли способ оптимизировать / векторизовать вышеуказанный код?

1 Ответ

0 голосов
/ 23 января 2019

Использовать вложенный список и установить понимание, а для тестовых наборов конвертировать в bool s - пусто set return False:

s = set(["Hi", "My"])
p["tmp"] = [bool(set(i.split(".")[1] for i in x).intersection(s)) for x in p["sentence"]]

print (p)
                   sentence    tmp
0    (A.Hi, B.My, C.Friend)   True
1  (AA.How, BB.Are, CC.You)  False

EDIT:

Если после разделения есть только 1 или 2 значения длины, вы можете выбрать последнее значение путем индексации [-1]:

p = pd.DataFrame({"sentence" : [("A.Hi",   "B.My",   "C.Friend"), \
                                ("AA.How", "BB.Are", "You")]})

print (p)
                 sentence
0  (A.Hi, B.My, C.Friend)
1   (AA.How, BB.Are, You)

s = set(["Hi", "My"])

p["tmp"] = [bool(set(i.split(".")[-1] for i in x).intersection(s)) for x in p["sentence"]]
print (p)
                 sentence    tmp
0  (A.Hi, B.My, C.Friend)   True
1   (AA.How, BB.Are, You)  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...