すべてのセルが辞書のリストで構成され、辞書の各リストがさまざまな長さ (0 を含む) である列を含む DataFrame があります。
例:
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」内の辞書の数であることに注意してください。私が念頭に置いていた目標は、一連の追加のデータフレーム/テーブル (「ランク」ごとに 1 つ) を作成し、これらを 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 とランクを簡単に照会できますが、この階層データの巻き戻しによってメイン テーブルが乱雑になることはありません。
ただし、問題は、この列からデータフレームを作成する方法がわからないことです。私は多くのことを試しました.最初のものです(機能する場合はforループにネストされますが、もちろん機能しませんでした):
Rank_1 = pd.DataFrame(df.loc[df['count'] > 0]['RANKS'].map(lambda x: pd.DataFrame(x[0])))
そして、2 つ目は、価格が私にとって最も重要な要素であるためです。
for i in range(0,5):
df['rank_%s' % str(i+1)] = df[df['count'] > i]['RANKS'].map(lambda x: x[i]['price'].strip('$'))
次に float に変換します。これは機能しますが、かなり大きな妥協点です。ランクごとに個別の DataFrames という私の目標を達成するための効率的な方法 (NaN にハングアップしない) はありますか?