#python #python-3.x #pandas
#python #python-3.x #pandas
Вопрос:
Пытаюсь очистить данные Twitter как фрейм данных panda. Кажется, я пропустил один шаг. После того, как я обработаю все твиты, я думаю, что мне не хватает перезаписи новых поверх старых твитов? Когда я сохраняю файл, я не вижу никаких изменений в твитах. Чего мне не хватает?
import pandas as pd
import re
import emoji
import nltk
nltk.download('words')
words = set(nltk.corpus.words.words())
trump_df = pd.read_csv('new_Trump.csv')
for tweet in trump_df['tweet']:
tweet = re.sub("@[A-Za-z0-9] ","",tweet) #Remove @ sign
tweet = re.sub(r"(?:@|http?://|https?://|www)S ", "", tweet) #Remove http links
tweet = " ".join(tweet.split())
tweet = ''.join(c for c in tweet if c not in emoji.UNICODE_EMOJI) #Remove Emojis
tweet = tweet.replace("#", "").replace("_", " ") #Remove hashtag sign but keep the text
tweet = " ".join(w for w in nltk.wordpunct_tokenize(tweet)
if w.lower() in words or not w.isalpha()) #Remove non-english tweets (not 100% success)
print(tweet)
trump_df.to_csv('new_Trump.csv')
Комментарии:
1. Точно, вы никогда не сохраняете измененный твит обратно в dataframe.
2. вам нужно сохранить каждый
tweet
из них в конце цикла for
Ответ №1:
Как вы очень хорошо сказали, вы никогда не сохраняете данные обратно, давайте создадим функцию, которая выполняет всю работу, а затем передадим ее в dataframe с помощью map
. Это более эффективно, чем перебирать каждое значение в dataframe и сохранять его в списке (вариант B).
def cleaner(tweet):
tweet = re.sub("@[A-Za-z0-9] ","",tweet) #Remove @ sign
tweet = re.sub(r"(?:@|http?://|https?://|www)S ", "", tweet) #Remove http links
tweet = " ".join(tweet.split())
tweet = ''.join(c for c in tweet if c not in emoji.UNICODE_EMOJI) #Remove Emojis
tweet = tweet.replace("#", "").replace("_", " ") #Remove hashtag sign but keep the text
tweet = " ".join(w for w in nltk.wordpunct_tokenize(tweet)
if w.lower() in words or not w.isalpha())
return tweet
trump_df['tweet'] = trump_df['tweet'].map(lambda x: cleaner(x))
trump_df.to_csv('') #specify location
Это приведет к перезаписи tweet
столбца с изменениями.
Вариант B:
Как уже говорилось, я думаю, это окажется немного более неэффективным, но это так же просто, как создать список перед for
циклом, заполняя его каждым чистым твитом.
clean_tweets = []
for tweet in trump_df['tweet']:
tweet = re.sub("@[A-Za-z0-9] ","",tweet) #Remove @ sign
##Here's where all the cleaning takes place
clean_tweets.append(tweet)
trump_df['tweet'] = clean_tweets
trump_df.to_csv('') #Specify location
Комментарии:
1. Я предпочитаю вариант «B». Спасибо.
2. Конечно! Вот почему я написал оба 🙂 Не стесняйтесь принять ответ, если это поможет вам решить проблему. Спасибо!
3. нужно подождать несколько минут, прежде чем он позволит мне принять.