найдите первое слово первого элемента списка кортежей в столбце?

#python #dataframe #tuples

Вопрос:

У меня есть поток данных, подобный этому:

 import pandas as pd

test = {'text': [
    ('tom-mark', 'tom', 'tom is a good guy.'),
    ('Nick X','nick', 'Is that Nick?')
]}, {'text': [
    ('juli', 'juli', 'Tom likes juli so much.'),
    ('tony', 'tony', 'Steve and Tony listen in as well.')
]}
 

Я хочу найти первое слово в первом элементе каждого кортежа (т. е. Том, Ник, Джули, Тони).

Я попробовал следующий код, но он не может справиться с » — «в tom-mark»

     name = t[0].lower()
    name = name.split()
    name = name[0]
 

Однако некоторые кортежи содержат 2 слова в качестве первого элемента. Как я мог найти первое слово каждого кортежа?

Комментарии:

1. Это вообще не использует панд. Это нормально?

2. Это может быть хорошим случаем для регулярных выражений. w будут совпадать буквенные символы.

Ответ №1:

Вы можете использовать фрейм данных pandas и использовать функцию для сопоставления значений text столбца, чтобы получить первое имя, а затем создать список из списка списков для этого конкретного столбца.

Внутри функции используйте регулярное выражение, чтобы извлечь только первое имя из всех кортежей в этом списке и вернуть список имен.

 import pandas as pd
import re


def get_first(x):
    return list(map(lambda tup: re.match(r'w ', tup[0])[0].lower(), x))

test = {'text': [
    ('tom-mark', 'tom', 'tom is a good guy.'),
    ('Nick X','nick', 'Is that Nick?')
]}, {'text': [
    ('juli', 'juli', 'Tom likes juli so much.'),
    ('tony', 'tony', 'Steve and Tony listen in as well.')
]}

data = sum(pd.DataFrame(test).applymap(get_first)['text'].tolist(), [])

print(data)
 

Комментарии:

1. Спасибо за ответ! Еще один вопрос, как можно заменить » — » на «» (т. е. пробел) в исходных данных (т. е. тест)

2. Для этого вы можете использовать return list(map(lambda tup: re.match(r'w ', tup[0].replace('-', ''))[0].lower(), x)) внутри функции get_first вместо return list(map(lambda tup: re.match(r'w ', tup[0])[0].lower(), x)) .

Ответ №2:

Помогает ли что-то подобное:

 import re

test = {'text': [
    ('tom-mark', 'tom', 'tom is a good guy.'),
    ('Nick X','nick', 'Is that Nick?'),
    ('juli', 'juli', 'Tom likes juli so much.'),
    ('tony', 'tony', 'Steve and Tony listen in as well.')]
}

first_names = []

for names in test['text']:
    name = re.match(r'w ', names[0])
    first_names.append(name[0].lower())


print(first_names)

['tom', 'nick', 'juli', 'tony']