私は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
ゼロの発生を数えることが可能かどうか知りたい
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
あなたはこれを使うことができます:
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
これを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データフレームにゼロを埋めることです。
ステップ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'])