web-dev-qa-db-ja.com

Pandasゼロ値のgroupby

私はcsvファイルにこのようなデータを持っています

Symbol,Action,Year
AAPL,Buy,2001
AAPL,Buy,2001
BAC,Sell,2002
BAC,Sell,2002

私はそれをこのように読んでグループ化することができます

df.groupby(['Symbol','Year']).count()

私は得る

             Action
Symbol Year        
AAPL   2001       2
BAC    2002       2

私はこれを望みます(順序は関係ありません)

             Action
Symbol Year        
AAPL   2001       2
AAPL   2002       0
BAC    2001       0
BAC    2002       2

ゼロの発生を数えることが可能かどうか知りたい

20
NinjaGaiden

pivot_table with unstack

print df.pivot_table(index='Symbol', 
                     columns='Year', 
                     values='Action',
                     fill_value=0, 
                     aggfunc='count').unstack()

Year  Symbol
2001  AAPL      2
      BAC       0
2002  AAPL      0
      BAC       2
dtype: int64

DataFrameとして出力が必要な場合は to_frame

print df.pivot_table(index='Symbol', 
                     columns='Year', 
                     values='Action',
                     fill_value=0, 
                     aggfunc='count').unstack()
                                     .to_frame()
                                     .rename(columns={0:'Action'})

             Action
Year Symbol        
2001 AAPL         2
     BAC          0
2002 AAPL         0
     BAC          2
17
jezrael

あなたはこれを使うことができます:

df = df.groupby(['Symbol','Year']).count().unstack(fill_value=0).stack()
print df

出力:

             Action
Symbol Year        
AAPL   2001       2
       2002       0
BAC    2001       0
       2002       2
14
Joe

これをpivot_tableを使用せずに実行したい場合は、以下のアプローチを試すことができます:

midx = pd.MultiIndex.from_product([ df['Symbol'].unique(), df['Year'].unique()], names=['Symbol', 'Year'])
df_grouped_by = df_grouped_by.reindex(midx, fill_value=0)

上記で基本的に行っていることは、2つの列を乗算するすべての可能な値のマルチインデックスを作成し、そのマルチインデックスを使用してgroup-byデータフレームにゼロを埋めることです。

0
Punit S

ステップ1:列にゼロ以外の各クラスのカウントを格納するデータフレームを作成counts

count_df = df.groupby(['Symbol','Year']).size().reset_index(name='counts')

ステップ2:次に、pivot_tableを使用して、既存のクラスと存在しないクラスの両方のカウントを含む目的のデータフレームを取得します。

df_final = pd.pivot_table(count_df,
                       index=['Symbol','Year'],
                       values='counts',                            
                       fill_value = 0,
                       dropna=False,
                       aggfunc=np.sum)

これで、カウントの値をコマンドでリストとして抽出できます

list(df_final['counts'])
0
Anjul Tyagi