#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']