Python: Pandas 来自字典系列的数据框
Python: Pandas dataframe from Series of dict
我有一个 Pandas 数据框:
type(original)
pandas.core.frame.DataFrame
其中包括系列对象 original['user']
:
type(original['user'])
pandas.core.series.Series
original['user']
指向多个dicts:
type(original['user'].ix[0])
dict
每个字典都有相同的键:
original['user'].ix[0].keys()
[u'follow_request_sent',
u'profile_use_background_image',
u'profile_text_color',
u'id',
u'verified',
u'profile_location',
# ... keys removed for brevity
]
以上是来自 tweeter API 的推文中 user
字段的一个指令(的一部分)。我想从这些字典构建一个数据框。
当我尝试直接制作数据框时,每行只有一列,而这一列包含整个字典:
pd.DataFrame(original['user'][:2])
user
0 {u'follow_request_sent': False, u'profile_use_...
1 {u'follow_request_sent': False, u'profile_use_..
当我尝试使用 from_dict() 创建数据框时,我得到了相同的结果:
pd.DataFrame.from_dict(original['user'][:2])
user
0 {u'follow_request_sent': False, u'profile_use_...
1 {u'follow_request_sent': False, u'profile_use_..
接下来我尝试了一个返回错误的列表理解:
item = [[k, v] for (k,v) in users]
ValueError: too many values to unpack
当我从单行创建数据框时,它几乎可以工作:
df = pd.DataFrame.from_dict(original['user'].ix[0])
df.reset_index()
index contributors_enabled created_at default_profile default_profile_image description entities favourites_count follow_request_sent followers_count following friends_count geo_enabled id id_str is_translation_enabled is_translator lang listed_count location name notifications profile_background_color profile_background_image_url profile_background_image_url_https profile_background_tile profile_image_url profile_image_url_https profile_link_color profile_location profile_sidebar_border_color profile_sidebar_fill_color profile_text_color profile_use_background_image protected screen_name statuses_count time_zone url utc_offset verified
0 description False Mon May 26 11:58:40 +0000 2014 True False {u'urls': []} 0 False 157
它几乎像我想要的那样工作,只是它将 description
字段设置为默认索引。
每个字典都有 40 个键,但我只需要大约 10 个键,数据框中有 28734 行。
如何过滤掉不需要的密钥?
我会尝试做以下事情:
new_df = pd.DataFrame(list(original['user']))
这会将系列转换为列表,然后将其传递给 pandas 数据框,它应该会处理其余部分。
df = original['user'].apply(pd.Series)
效果不错
这个有效:
series_of_dicts = original['user']
df = pd.DataFrame.from_records(
series_of_dicts.values, index=series_of_dicts.index
)
或者如果你有一个列表或其他可迭代的字典,那么一个简单的
pd.DataFrame.from_records(iterable_of_dicts)
有效。
Docs for DataFrame.from_records
我没有计时,但我想它应该很快,因为这正是 DataFrame.from_records() 的目的。
我有一个 Pandas 数据框:
type(original)
pandas.core.frame.DataFrame
其中包括系列对象 original['user']
:
type(original['user'])
pandas.core.series.Series
original['user']
指向多个dicts:
type(original['user'].ix[0])
dict
每个字典都有相同的键:
original['user'].ix[0].keys()
[u'follow_request_sent',
u'profile_use_background_image',
u'profile_text_color',
u'id',
u'verified',
u'profile_location',
# ... keys removed for brevity
]
以上是来自 tweeter API 的推文中 user
字段的一个指令(的一部分)。我想从这些字典构建一个数据框。
当我尝试直接制作数据框时,每行只有一列,而这一列包含整个字典:
pd.DataFrame(original['user'][:2])
user
0 {u'follow_request_sent': False, u'profile_use_...
1 {u'follow_request_sent': False, u'profile_use_..
当我尝试使用 from_dict() 创建数据框时,我得到了相同的结果:
pd.DataFrame.from_dict(original['user'][:2])
user
0 {u'follow_request_sent': False, u'profile_use_...
1 {u'follow_request_sent': False, u'profile_use_..
接下来我尝试了一个返回错误的列表理解:
item = [[k, v] for (k,v) in users]
ValueError: too many values to unpack
当我从单行创建数据框时,它几乎可以工作:
df = pd.DataFrame.from_dict(original['user'].ix[0])
df.reset_index()
index contributors_enabled created_at default_profile default_profile_image description entities favourites_count follow_request_sent followers_count following friends_count geo_enabled id id_str is_translation_enabled is_translator lang listed_count location name notifications profile_background_color profile_background_image_url profile_background_image_url_https profile_background_tile profile_image_url profile_image_url_https profile_link_color profile_location profile_sidebar_border_color profile_sidebar_fill_color profile_text_color profile_use_background_image protected screen_name statuses_count time_zone url utc_offset verified
0 description False Mon May 26 11:58:40 +0000 2014 True False {u'urls': []} 0 False 157
它几乎像我想要的那样工作,只是它将 description
字段设置为默认索引。
每个字典都有 40 个键,但我只需要大约 10 个键,数据框中有 28734 行。
如何过滤掉不需要的密钥?
我会尝试做以下事情:
new_df = pd.DataFrame(list(original['user']))
这会将系列转换为列表,然后将其传递给 pandas 数据框,它应该会处理其余部分。
df = original['user'].apply(pd.Series)
效果不错
这个有效:
series_of_dicts = original['user']
df = pd.DataFrame.from_records(
series_of_dicts.values, index=series_of_dicts.index
)
或者如果你有一个列表或其他可迭代的字典,那么一个简单的
pd.DataFrame.from_records(iterable_of_dicts)
有效。
Docs for DataFrame.from_records
我没有计时,但我想它应该很快,因为这正是 DataFrame.from_records() 的目的。