2017-07-06 26 views
3

我试图对我的Series对象'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) 

BTW,请勿使用ix索引器,因为它已折旧并将在未来版本的熊猫中删除。

+1

关于最近的熊猫回答。没有15个代表,人们不能投票。询问问题的人是你最肯定的投票。如果你回答一个没有必要代表的人的问题,你就可以投票给他们......帮他们一个忙,给他们的问题投票,以帮助他们过上正轨。 – piRSquared

+0

这是非常好的建议,最感谢@piRSquared! – mkos

相关问题