我在csv文件中有这样的数据
Symbol,Action,Year
AAPL,Buy,2001
AAPL,Buy,2001
BAC,Sell,2002
BAC,Sell,2002
我能够像这样阅读它和groupby
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
我想知道是否有可能计算零出现次数
答案 0 :(得分:16)
您可以pivot_table
使用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
答案 1 :(得分:10)
您可以使用:
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
答案 2 :(得分:0)
如果您想在不使用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)
我们上面所做的是创建所有可能值的多索引,将两列相乘,然后使用该多索引将零填充到我们的分组数据帧中。
答案 3 :(得分:0)
数据类型类别
打开此线程时也许不存在此功能,但是数据类型“ category”可以在这里提供帮助:
# create a dataframe with one combination of a,b missing
df = pd.DataFrame({"a":[0,1,1], "b": [0,1,0]})
df = df.astype({"a":"category", "b":"category"})
print(df)
数据框如下所示:
a b
0 0 0
1 1 1
2 1 0
现在,按a和b分组
print(df.groupby(["a","b"]).size())
产量:
a b
0 0 1
1 0
1 0 1
1 1
请注意最右边一栏中的0。 pandas userguide(在“ groupby”的页面搜索中)也记录了此行为。