操作包含Twitter API字典的Pandas DataFrame
我正在写一个脚本,利用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)
这段代码返回了一个大小为(400,25)的DataFrame。使用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
这一列拆分成更多的列呢?比如,我希望symbols
、user_mentions
、hashtags
等能够变成df
中的额外列。
非常感谢任何帮助。
2 个回答
3
下面的代码实现了我在问题中提到的内容:
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])