我试图访问这个国家'我从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
这'我如何访问我的数据。
传递'文字'和' 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
但它没有传入推文[' country'] Dataframe。 我用
检查了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但不确定如何。 我稍后使用这些Dataframes与matplotlib制作表格。
修改 请求我使用的json文件的示例: 的 EDIT2: 自从我得到答案后删除了json的样本。谢谢。
答案 0 :(得分:2)
问题基本上是因为您要分配到数据框,如 -
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
我建议您将数据框架创建为 -
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)
,默认情况下没有第二个参数,如果找不到密钥,则返回None。
答案 1 :(得分:0)
问题在于tweets['country'] = tweet['place']['country']
每次都会重新分配整个列(您获得了结果,因为您的循环中的最后一个国家/地区是“美国&#39;”。
此外,您还未指定“国家/地区”时要执行的操作。是没有。
怎么样:
tweets['country'] = [tweet['place']['country'] for tweet in tweets_data]
tweets['country'].fillna('N/A', inplace=True)