如果我有以下格式的数据(存储在pandas dataframe中),本质上是将类别和商品的标准化形式转换为slug:
pandas.DataFrame:
categories slug wares
0 [developer, mac, web] alex.payne [macbook-pro, cinema-display, readynas-nv-plus...
1 [mac, musician] jona.bechtolt [audio-kontrol-1, powershot-sd1000, live, mda-...
2 [game, suit, windows] gabe.newell [oa-desk, beyond-tv, windows-xp, office, visua...
3 [developer, mac, software] steven.frank [mac-pro, macbook-air, apple-tv, itunes, addre...我的意图是绘制与商品相关的类别图,我需要非正规化格式的数据,如下所示:
categories wares slug
0 developer macbook-pro alex.payne
1 mac macbook-pro alex.payne
2 web macbook-pro alex.payne
3 developer cinema-display alex.payne
4 mac cinema-display alex.payne
5 web cinema-display alex.payne
6 developer readynas-nv-plus alex.payne将数据从上面的格式转换成下面的格式的最好方法是什么,最好是利用numpy的内部结构的格式,所以它很快。
我的方法相当天真,遍历数据帧中的每一行,维护一个元组列表,然后将其传递给pandas.DataFrame构造函数。你的任何建议都可能最终变得更快更好,所以建议你离开吧!
我还在考虑这种数据在pandas DataFrame中的替代表示,具体地说,就是稀疏矩阵。但我认为这会更好,特别是对于groupby查询。如果有其他格式,或者如果稀疏矩阵更适合这样的聚合查询,建议如何进行。
对于那些感兴趣的人,整个事情是这样的:http://j.mp/lp-usesthis我最终没有按照我最初想要的方式去规范化,而是只在感兴趣的列上循环。但任何更好地去规范化的能力都会让它变得更好。
发布于 2013-09-02 23:10:27
首先,我强烈建议你不要像这样存储你的数据,pandas并不是用来存储像列表这样的对象的。
以下是提取数据的一种方法(使用joins、similar to Dan Allen's answer)。
def denormalise(df, *colnames):
df1 = df.copy() # optional, but means we're not changing df globally
cols = [(colname, df1.pop(colname).apply(pd.Series).stack()) for colname in colnames]
for colname, c in cols:
c.index = c.index.droplevel(-1)
c.name = colname
df1 = df1.join(c)
return df1
# optionally .reindex_axis(df.columns, axis=1) # reorder columns
# and .reset_index(drop=True) # 0,1,...n index使用中:
In [11]: denormalise(df1, 'wares')
Out[11]:
categories slug wares
0 [developer, mac, web] alex.payne macbook-pro
0 [developer, mac, web] alex.payne cinema-display
0 [developer, mac, web] alex.payne readynas-nv-plus
1 [mac, musician] jona.bechtolt audio-kontrol-1
1 [mac, musician] jona.bechtolt powershot-sd1000
1 [mac, musician] jona.bechtolt live为了方便起见,Pandas允许您将其添加为DataFrame方法:
In [12]: pd.DataFrame.denormalise = denormalise
In [13]: df1.denormalise('wares', 'categories')
Out[13]:
slug wares categories
0 alex.payne macbook-pro developer
0 alex.payne macbook-pro mac
0 alex.payne macbook-pro web
0 alex.payne cinema-display developer
0 alex.payne cinema-display mac
0 alex.payne cinema-display web
0 alex.payne readynas-nv-plus developer
0 alex.payne readynas-nv-plus mac
0 alex.payne readynas-nv-plus web
1 jona.bechtolt audio-kontrol-1 mac
1 jona.bechtolt audio-kontrol-1 musician
1 jona.bechtolt powershot-sd1000 mac
1 jona.bechtolt powershot-sd1000 musician
1 jona.bechtolt live mac
1 jona.bechtolt live musician
In [14]: df1.denormalise('wares', 'categories').reset_index(drop=True)
Out[14]:
slug wares categories
0 alex.payne macbook-pro developer
1 alex.payne macbook-pro mac
2 alex.payne macbook-pro web
3 alex.payne cinema-display developer
4 alex.payne cinema-display mac
5 alex.payne cinema-display web
6 alex.payne readynas-nv-plus developer
7 alex.payne readynas-nv-plus mac
8 alex.payne readynas-nv-plus web
9 jona.bechtolt audio-kontrol-1 mac
10 jona.bechtolt audio-kontrol-1 musician
11 jona.bechtolt powershot-sd1000 mac
12 jona.bechtolt powershot-sd1000 musician
13 jona.bechtolt live mac
14 jona.bechtolt live musicianhttps://stackoverflow.com/questions/17431948
复制相似问题