【问题标题】:Python - Problems passing value into DataframePython - 将值传递到数据框的问题
【发布时间】:2015-09-03 20:03:32
【问题描述】:

我正在尝试访问从 twitter 获得的 json 中的“国家”值。我使用 straming API 来获取一些推文并将它们保存到一个文件中。

import json
import pandas as pd
import matplotlib.pyplot as plt

tweets_data_path = 'E:/Python_prog/twitter_data.json'
tweets_data = []
tweets_file = open(tweets_data_path, "r")

for line in tweets_file:
    try:

        tweets_data.append(json.loads(line))

    except:
        pass

这就是我访问数据的方式。

将 'text' 和 'lang' 传递到 Dataframe 中没有问题。

tweets = pd.DataFrame()

tweets['text'] = [tweet['text'] for tweet in tweets_data]
tweets['lang'] = [tweet['lang'] for tweet in tweets_data]

我知道“地方”可以是空的,所以我尝试了这个:

for tweet in tweets_data:
    if tweet['place'] is not None:
        print(tweet['place']['country'])
        tweets['country'] = tweet['place']['country']

我使用 print 来检查我是否得到了正确的值并且有效。 我得到这个输出:

United States
United States
United States
United States
United States
United States
Malaysia
United States
United States
United States
United States

但它不会传递到 tweets['country'] 数据框。 我正在使用

检查数据框

打印(推文['国家'])

这就是我的输出:

0      United States
1      United States
2      United States
3      United States
4      United States
5      United States
6      United States
7      United States
8      United States
9      United States
.. 
302    United States
303    United States

我认为是 303,因为我的文件中有 304 条推文。 我的问题是将值正确传递到 Dataframe 但不确定如何。 稍后我将使用这些 Dataframes 使用 matplotlib 制作表格。

编辑: 根据要求提供我使用的 json 文件样本: 编辑2: 自从我得到答案后,删除了 json 的样本。谢谢。

【问题讨论】:

  • 请添加您正在处理的 .json 文件的一些示例。

标签: python twitter pandas


【解决方案1】:

这个问题基本上是因为你正在分配给你的数据框,比如 -

tweets['country'] = tweet['place']['country']

您正在尝试为整个系列分配一个值,因此它会用该值完全覆盖所有值。示例 -

In [3]: df = pd.DataFrame([[1,2],[3,4]],columns = ['A','B'])

In [4]: df
Out[4]:
   A  B
0  1  2
1  3  4

In [5]: df['C'] = 2

In [6]: df
Out[6]:
   A  B  C
0  1  2  2
1  3  4  2

我建议您将 DataFrame 创建为 -

tweet_list = [[tweet['text'], tweet['lang'], tweet.get('place','<some default dict with country key>')['country']] for tweet in tweets_data]

tweets = pd.DataFrame(tweet_list, columns=['text','lang','country'])

您需要为没有国家/地区的推文提供一些默认值,您可以在那里提供一个空字符串。 dict.get(key),如果没有找到key,默认没有第二个参数返回None。

【讨论】:

  • 我不确定如何为没有国家/地区的推文提供默认值。你能告诉我怎么做吗?
  • 使用分配给国家/地区键的默认值创建一个字典,并将其用作 .get() 调用的第二个参数。
【解决方案2】:

问题在于tweets['country'] = tweet['place']['country'] 每次都会重新分配整个列(您会得到您所做的结果,因为循环中的最后一个国家/地区是“美国”。)

此外,当 'country' 为 None 时,您还没有指定要执行的操作。

怎么样:

tweets['country'] = [tweet['place']['country'] for tweet in tweets_data]
tweets['country'].fillna('N/A', inplace=True)

【讨论】:

    猜你喜欢
    • 2014-09-20
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 2012-10-11
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多