繁体   English   中英

Python-将值传递到Dataframe的问题

[英]Python - Problems passing value into Dataframe

我正在尝试访问从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

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

将“文本”和“语言”传递到数据帧中没有问题。

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'] Dataframe中。 我正在检查数据框后

打印(鸣叫[ '国家'])

那就是我的输出:

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中,但不确定如何传递。 稍后,我将使用这些数据框与matplotlib制作表。

编辑:根据要求,我使用json文件的样本: edit2:因为得到答案,所以删除了json的样本。 谢谢。

基本上会出现此问题,因为您正在将数据帧分配给-

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。

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

此外,当“国家/地区”为“无”时,您尚未指定要执行的操作。

怎么样:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM