[英]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.