#python #pandas
#python #панды
Вопрос:
У меня есть этот список (из столбца pandas: df['Text'].tolist()
:
my_list=[came',
'ป้องกัน',
'moreover',
'sah',
'esketamine',
'accredited',
'condition',
'tailored',
'acts',
'terms',
"'",
'البارد',
'demonstrate',
'amidst',
'atotxa',
'design',
'ante',
'ebsite',
'problems',
'oncosomes',
'gradient',
'tenable',
'processing',
'elemental',
'card',
'spreads',
'मंत्रालय',
'airlines',
'desde',
'retains',
'n',
'–',
'ты']
Я хотел бы сохранить только слова больше 2 и которые на английском языке.
То, что я попробовал, заключается в следующем:
-применить фильтр для слов, имеющих длину> 2:
new_corpus = list( map(lambda words: list(filter(lambda word: len(word)> 2, words)), my_list))
-затем применить detect()
для каждого элемента в списке:
def det(x):
lang = detect(x)
return lang
new_corpus.apply(det)
Проблема в том, что с первым кодом я получаю все [] (пустые элементы), поэтому я не могу применить какую-либо detect
функцию к списку.
Мой ожидаемый результат будет:
my_list=[came',
'moreover',
'sah', # it depends on detect function, if it selects this element as English or not
'esketamine',
'accredited',
'condition',
'tailored',
'acts',
'terms',
'demonstrate',
'amidst', # it depends on detect function, if it selects this element as English or not
'atotxa', # it depends on detect function, if it selects this element as English or not
'design',
'ante',
'ebsite', # it depends on detect function, if it selects this element as English or not
'problems',
'oncosomes', # it depends on detect function, if it selects this element as English or not
'gradient',
'tenable',
'processing',
'elemental',
'card',
'spreads',
'airlines',
'desde', # it depends on detect function, if it selects this element as English or not
'retains'
]
Ответ №1:
Давайте сделаем
cond1 = df['Text'].str.len()>=2
cond2 = df['Text'].map(detect)=='en'
df_sub = df[cond1 amp; cond2]
#df.loc[cond1 amp; cond2, 'Text'].tolist()
Комментарии:
1. Большое вам спасибо @BEN_YO. Я выбрал другой ответ только потому, что нашел его более похожим на то, что я пытался сделать. Но и ваш отлично работает и использует другой подход. Спасибо
Ответ №2:
Самый простой способ сделать это — использовать понимание списка.Это позволяет свести всю логику к одной строке. Реализация может быть:
new_corpus = [word for word in my_list if len(word) > 2 and detect(word)]
Кроме того, этот метод можно использовать для создания отфильтрованного списка непосредственно из фрейма данных. Реализация может быть:
new_corpus = [word for word in df['Text'].tolist() if len(word) > 2 and detect(word)]
Однако это не позволяет df['Text'].tolist()
впоследствии получить доступ.
Комментарии:
1. Спасибо вам обоим за ваш ответ, поскольку оба отлично работают. Я хотел бы предложить одну вещь, @bbnumber2: с помощью detect можно получить ошибку из-за длины слова. Поэтому, вероятно, было бы лучше переключить detect и len в вашем коде. Таким образом, код будет выполняться без ошибок 😉
2. И еще одно: автоматически ли он определяет ‘en’ как язык? это работает, но я хотел бы понять, выполняется ли это автоматически и / или мне нужно что-то сделать, чтобы изменить / определить другой язык
3. @still_learning Это будет зависеть от вашей реализации
detect()
функции.