【问题标题】:Manipulate Pandas DataFrame containing dictionaries from Twitter API操作包含来自 Twitter API 的字典的 Pandas DataFrame
【发布时间】:2014-06-20 07:25:06
【问题描述】:

我正在编写一个脚本,该脚本使用 Twitter API 从用户列表中提取最近的状态。我可以使用 API 检索数据,但是在将其转换为 DataFrame 后,我得到了存储字典的列。我想将这些字典的索引传播到其他列。最终,我试图将所有这些信息保存到 CSV。

代码如下:

import twython
import time
import pandas as pd
import numpy as np

app_key = ''
app_secret = ''
oauth_token = ''
oauth_token_secret = ''

twitter = twython.Twython(app_key, app_secret, oauth_token, oauth_token_secret)

screen_names = ['@', '@'] #enter screen names of interest

tweets = []

for screen_name in screen_names:
    tweets.extend(twitter.get_user_timeline(screen_name=screen_name, count=200))
    time.sleep(5)

df = pd.DataFrame(tweets)

返回一个 DataFrame (400,25)。 df[[2,3,5]] 返回以下内容:

     created_at                       entities                                         favorite_count
0    Thu Jun 19 13:14:39 +0000 2014  {u'symbols': [], u'user_mentions': [], u'hasht...       0
1    Thu Jun 19 11:53:51 +0000 2014  {u'symbols': [], u'user_mentions': [{u'id': 18...       0
2    Thu Jun 19 11:53:25 +0000 2014  {u'symbols': [], u'user_mentions': [], u'hasht...       3
3    Thu Jun 19 11:49:34 +0000 2014  {u'symbols': [], u'user_mentions': [], u'hasht...       0
4    Thu Jun 19 11:01:31 +0000 2014  {u'symbols': [], u'user_mentions': [{u'id': 18...       0

如何将 entities 列拆分为其他列?例如,我希望 symbolsuser_mentionshastags 等成为df

非常感谢任何帮助。

【问题讨论】:

  • 也许您可以通过查看此帖子找到解决方案:stackoverflow.com/a/23884434/1082349。在那里,有人描述了如何拆分位于一列中的 numpy 数组,以使每个数组值都位于一列中。
  • @FooBar 谢谢,正在调查。 df[entities].tolist() 似乎把我带到了某个地方。

标签: python twitter pandas twython


【解决方案1】:

以下内容完成了我在问题中提出的问题:

df_entities = pd.DataFrame(df['t_entities'].tolist())

df = df.join([df_entities, df_user])

【讨论】:

    【解决方案2】:

    我使用这个辅助函数将嵌套值的字典(可能来自 API)转换为没有嵌套值的字典。

    def flatten(d):
        for key in d.keys():
            if isinstance(d[key], list):
                value = d.pop(key)
                for i, v in enumerate(value):
                    d.update(flatten({'%s__%s' % (key, i): v}))
            elif isinstance(d[key], dict):
                value = d.pop(key)
                d.update([('%s__%s' % (key, sub), v) for (sub, v) in flatten(value).items()])
        return d
    

    下面是一个例子:

    In [2]: d = {'user': 'foo', 'data': {'choices': [0,1,2], 'type': 'x1'}}
    
    In [3]: flatten(d)
    Out[3]: 
    {'data__choices__0': 0,
     'data__choices__1': 1,
     'data__choices__2': 2,
     'data__type': 'x1',
     'user': 'foo'}
    

    在您的示例中,您需要执行以下操作:

    df = pd.DataFrame([flatten(t) for t in tweets])
    

    【讨论】:

    • 谢谢!很有帮助!
    猜你喜欢
    • 2021-07-10
    • 2019-11-16
    • 1970-01-01
    • 2011-05-11
    • 2021-10-04
    • 2022-10-13
    • 2018-01-01
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多