2017-07-06 16 views
3

私のシリーズオブジェクト 'tweet_text'の各文字列を変更しようとしていますが、forループのつぶやきを変更した後にシリーズオブジェクトを印刷する何らかの理由で、 forループ。これをどうすれば解決できますか?パンダのデータフレームを変更しても、その値が更新されないのはなぜですか?

import pandas as pd 
import re 
import string 

df = pd.read_csv('sample-tweets.csv', 
       names=['Tweet_Date', 'User_ID', 'Tweet_Text', 'Favorites', 'Retweets', 'Tweet_ID']) 

sum_df = df[['User_ID', 'Tweet_ID', 'Tweet_Text']].copy() 
sum_df.set_index(['User_ID']) 
# print sum_df 

tweet_text = df.ix[:, 2] 
print type(tweet_text) 

# efficiency could be im proved by using translate method 
# regex = re.compile('[%s]' % re.escape(string.punctuation)) 

for tweet in tweet_text: 
    tweet = re.sub('https://t.co/[a-zA-Z0-9]*', "", tweet) 
    tweet = re.sub('@[a-zA-Z0-9]*', '', tweet) 
    tweet = re.sub('#[a-zA-Z0-9]*', '', tweet) 
    tweet = re.sub('$[a-zA-Z0-9]*', '', tweet) 
    tweet = ''.join(i for i in tweet if not i.isdigit()) 
    tweet = tweet.replace('"', '') 
    tweet = re.sub(r'[\(\[].*?[\)\]]', '', tweet) # takes out everything between parentheses also, fix this 

    # gets rid of all punctuation and emoji's 
    tweet = "".join(l for l in tweet if l not in string.punctuation) 
    tweet = re.sub(r'[^\x00-\x7F]+',' ', tweet) 

    # gets ride of all extra spacing 
    tweet = tweet.lower() 
    tweet = tweet.strip() 
    tweet = " ".join(tweet.split()) 

    count = count + 1 
    # print tweet 

print tweet_text 
+2

変数でツイートを取っているので、いくつか変更を加えてから次の繰り返しが始まります。変更されたデータをシリーズに戻すことはできません。 – TrigonaMinima

答えて

1

Python文字列は不変です。変数tweetに帰属する値を変更するだけで、データフレームを実際に更新することはありません。

更新された値をデータフレームに再挿入するだけで済みます。

for i, tweet in enumerate(tweet_text): 
    tweet = re.sub('https://t.co/[a-zA-Z0-9]*', "", tweet) 
    tweet = re.sub('@[a-zA-Z0-9]*', '', tweet) 

    # ... 

    # update dataframe 
    df.ix[i, 2] = tweet 
+0

ありがとう!私は、データフレームが不変であるかどうかを調べようとしましたが、文字列が不変かどうかをチェックするのを忘れていました(私はPythonの笑ではそうは思わないでしょう)。 – praneeth98

2

tweet_textが列スタータ用df.ix[:, 2]のコピーであるので、それはそのように起こっている:簡単な修正の例。第二に、これはSeriesを反復するパンダの方法ではありません - apply()を使用する必要があります。

は、ループに入り、すべてをあなたのコードを更新するには、関数に変更します。次に

def parse_tweet(tweet): 
    ## everything from loop goes here 
    return tweet 

、代わりに:

tweet_text = df.ix[:, 2] 

を行います

ところで
df.iloc[:, 2] = df.iloc[:, 2].apply(parse_tweet) 

ixインデクサを使用しないでください.PDAの将来のバージョンでは削除される予定です。

+1

あなたの最新のパンダの答えについて。人々は15人の担当者がなければ投票できません。質問をしている人はあなたの最も高い投票です。あなたが投票に必要な担当者がいない人の質問に答えるなら、あなたに投票してください。 – piRSquared

+0

これは非常に良いアドバイスです、最も感謝して、@ piRSquared! – mkos

関連する問題