Python - 将值传递到Dataframe

时间:2015-09-03 11:39:32

标签: python twitter pandas

我试图访问这个国家'我从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的样本。谢谢。

2 个答案:

答案 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)