Pandas groupby为零值

时间:2016-05-03 11:38:11

标签: python pandas dataframe group-by

我在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

我想知道是否有可能计算零出现次数

4 个答案:

答案 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”的页面搜索中)也记录了此行为。