为什么我的pandas数据框在更改它们时没有更新其值?

时间:2017-07-06 19:03:11

标签: python pandas dataframe series

我正在尝试更改我的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 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为tweet_text是初学者专栏df.ix[:, 2]的副本。其次,这不是pandas迭代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索引器,因为它已被折旧,并将在未来版本的pandas中删除。

答案 1 :(得分: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