【问题标题】:Why is my pandas dataframe not updating its values as I change them?为什么我的 pandas 数据框在我更改它们时没有更新它的值?
【发布时间】:2017-12-10 22:30:11
【问题描述】:

我正在尝试对我的系列对象“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

【问题讨论】:

  • 因为您正在变量中获取推文,对其进行一些更改,然后下一次迭代开始。您没有将更改的数据分配回系列。

标签: python pandas dataframe series


【解决方案1】:

之所以会这样,是因为 tweet_textdf.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 索引器,因为它已被贬低,并将在未来的熊猫版本中被删除。

【讨论】:

  • 关于您最近的熊猫回答。没有 15 个代表,人们就无法投票。提出问题的人是您最确定的赞成票。如果您回答某人的问题,而没有必要的代表为您投票……请帮他们一个忙,并为他们的问题投票,以帮助他们越过这条线。
【解决方案2】:

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

【讨论】:

  • 谢谢!我一直在尝试查看数据帧是否不可变,但忘记检查字符串是否不可变(我本来希望在 python 中不然哈哈)
猜你喜欢
  • 2023-01-12
  • 2015-06-17
  • 2021-08-16
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多