【发布时间】:2015-04-23 16:36:13
【问题描述】:
我有一个 DataFrame,其中包含一个列,其中每个单元格都由一个 dicts 列表组成,每个 dicts 列表的长度不同(包括 0)。
一个例子:
df = pd.DataFrame({'ID' : [13423,294847,322844,429847], 'RANKS': [[{u'name': u'A', u'price': u'$1.00', u'rank': u'1'},
{u'name': u'B', u'price': u'$4.00', u'rank': u'2'},
{u'name': u'C', u'price': u'$3.99', u'rank': u'3'},
{u'name': u'D', u'price': u'$2.00', u'rank': u'4'},
{u'name': u'E', u'price': u'$2.50', u'rank': u'5'}],
[{u'name': u'AA', u'price': u'$1.99', u'rank': u'1'},
{u'name': u'BB', u'price': u'$6.99', u'rank': u'2'}],
[{u'name': u'Z', u'price': u'$0.99', u'rank': u'1'},
{u'name': u'Y', u'price': u'$10.00', u'rank': u'2'},
{u'name': u'X', u'price': u'$1.99', u'rank': u'3'}],[]], 'count' : [5,2,3,0]})
请注意,'count' 是 'RANKS' 中的字典数。我想到的目标是创建一系列额外的数据框/表(每个“等级”一个)并将它们链接到 HDFStore 中的主表。比如:
Rank_2
ID Price Name
13423 $4.00 B
294847 $6.99 BB
322844 $10.99 Y
429847 NaN NaN
Rank_3
ID Price Name
13423 $3.99 C
294847 NaN NaN
322844 $1.99 X
429847 NaN NaN
这样,如果需要,我可以轻松查询 ID 和排名,但主表不会因为这些分层数据的展开而变得混乱。
但是,问题是我无法弄清楚如何从该列创建 DataFrame。我已经尝试了很多东西,第一个(如果它有效则嵌套在 for 循环中,但当然它没有):
Rank_1 = pd.DataFrame(df.loc[df['count'] > 0]['RANKS'].map(lambda x: pd.DataFrame(x[0])))
其次,因为价格对我来说是最重要的部分:
for i in range(0,5):
df['rank_%s' % str(i+1)] = df[df['count'] > i]['RANKS'].map(lambda x: x[i]['price'].strip('$'))
然后转换为浮点数。这可行,但这是一个很大的妥协。有没有一种有效的方法(不会挂在 NaN 上)来实现我为每个等级单独 DataFrames 的目标?
【问题讨论】:
-
James,您应该考虑将您的帖子分成两个问题。一种用于将您的数据帧拆分为多个数据帧并用于 HDFStore 问题。
-
会的。谢谢你,鲍勃。
-
我的直觉反应是你可能不将你的DataFrame分解成许多更小的DataFrame。处理大量小型 DataFrame 需要一个 Python 循环,这通常是通往缓慢之路的一步。相反,我认为使用一个 DataFrame 可能会更好地为您服务,它会使 dicts 列表变平,以便每个内部 dict 在 DataFrame 中都有自己的行。内部字典的键将成为新列。我怀疑这种单一的平面 DataFrame 格式将能够执行多个 DataFrame 替代方案可以做的任何事情,但速度更快,并且它会使保存到 HDFStore 变得简单。
-
第二个问题的链接(有些相关的帖子):stackoverflow.com/q/28662373/4586746
-
@unutbu 感谢您的回复。我肯定有点同意。而且您不认为按照您的建议将其展平会导致已经很大的 DataFrame(150 万行和大约 9GB 的内存使用)出现任何性能问题?
标签: python-2.7 pandas pytables hdfstore