3

次の形式 (pandas データフレームに格納されている) のデータがある場合、基本的には、スラッグに対するカテゴリと商品の正規化された形式です。

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私は、最初に意図した方法で非正規化を行わず、代わりに関心のある列のみをループしました。しかし、より適切に非正規化する能力があれば、それはより良くなります。

4

1 に答える 1

1

まず、そもそもこのようなデータを保存しないことを強くお勧めします。pandas は、リストなどの一般的なオブジェクト用ではありません。

データを抽出する 1 つの方法を次に示します ( Dan Allen の回答と同様に、結合を使用します)。

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   musician
于 2013-09-02T15:10:27.230 に答える