4

期待どおりにピボットしないpandas.DataFrameがあります。すべてをpivot_table適切に配置しますが、集計関数を使用してそこに到達するという事実は不快です。さらにpivot_table、フラットなデータ フレームではなく、不必要に複雑なオブジェクトを返すようです。

次の例を考えてみましょう

import pandas as pd
df = pd.DataFrame({'firstname':['Jon']*3+['Amy']*2,
                   'lastname':['Cho']*3+['Frond']*2,
                   'vehicle':['bike', 'car', 'plane','bike','plane'],
                   'weight':[81.003]*3+[65.6886]*2,
                   'speed':[29.022, 95.1144, 302.952, 27.101, 344.2],})
df.set_index(['firstname','lastname','weight'])

print('------  Unnecessary pivot_table does averaging  ------')
print(pd.pivot_table(df, values='speed',
                         rows='firstname','lastname','weight'],
                         cols='vehicle'))

print('------ pivot method dies  ------')
print(df.pivot( index=['firstname','lastname','weight'],
                columns='vehicle',
                values='speed'))

pivot_table結果は

vehicle                       bike      car    plane
firstname lastname weight                           
Amy       Frond    65.6886  27.101      NaN  344.200
Jon       Cho      81.0030  29.022  95.1144  302.952

pivotコマンドが行ったのと本質的に同じ出力を与える方法はありpivot_tableますか (ただし、うまくいけば、よりフラットできれいになります)。それができない場合、出力を平坦化するにはどうすればよいpivot_tableですか? 出力として欲しいのは、次のようなものです。

firstname lastname weight     bike      car    plane                           
Amy       Frond    65.6886  27.101      NaN  344.200
Jon       Cho      81.0030  29.022  95.1144  302.952
4

1 に答える 1

7

の集計が必要ない場合はpivot_table、実際にpivot関数が必要です。ただし、pivot複数のインデックス列を提供しても機能しません (実際には理由がわかりません)。ただし、ピボットと同様の機能がありunstackます。これは同じように機能しますが、列ではなく (マルチ) インデックスに基づいています。

したがって、これを使用するには、最初に結果のインデックス/列ラベルとして必要な列をインデックスとして設定できます。

df2 = df.set_index(['firstname','lastname','weight', 'vehicle'])

次に、最後のレベル (デフォルト) でスタックを解除し、「vehicle」(列ラベルになります) でスタックを解除します。

In [3]: df2.unstack()
Out[3]:
                             speed
vehicle                       bike      car    plane
firstname lastname weight
Amy       Frond    65.6886  27.101      NaN  344.200
Jon       Cho      81.0030  29.022  95.1144  302.952

マルチインデックスが必要ない場合は、 を使用して結果を「平坦化」できますreset_index
これで発生する可能性がある唯一の問題は、列にも 2 つのレベルがあるため、最初のレベルを削除してからインデックスをリセットして、非常にフラットなデータフレームにすることができるということです。

In [17]: df3 = df2.unstack()

In [18]: df3.columns = df3.columns.droplevel(0)

In [19]: df3.reset_index()
Out[19]:
vehicle firstname lastname   weight    bike      car    plane
0             Amy    Frond  65.6886  27.101      NaN  344.200
1             Jon      Cho  81.0030  29.022  95.1144  302.952
于 2013-09-10T20:32:27.530 に答える