Pandas groupby为零值

Nin*_*den 19 python group-by dataframe pandas

我在csv文件中有这样的数据

Symbol,Action,Year
AAPL,Buy,2001
AAPL,Buy,2001
BAC,Sell,2002
BAC,Sell,2002
Run Code Online (Sandbox Code Playgroud)

我能够像这样阅读它和groupby

df.groupby(['Symbol','Year']).count()
Run Code Online (Sandbox Code Playgroud)

我明白了

             Action
Symbol Year        
AAPL   2001       2
BAC    2002       2
Run Code Online (Sandbox Code Playgroud)

我希望这个(顺序无关紧要)

             Action
Symbol Year        
AAPL   2001       2
AAPL   2002       0
BAC    2001       0
BAC    2002       2
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 19

你可以用pivot_tableunstack:

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
Run Code Online (Sandbox Code Playgroud)

如果您需要输出作为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
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 15

你可以用这个:

df = df.groupby(['Symbol','Year']).count().unstack(fill_value=0).stack()
print df
Run Code Online (Sandbox Code Playgroud)

输出:

             Action
Symbol Year        
AAPL   2001       2
       2002       0
BAC    2001       0
       2002       2
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于一组对象吗?它似乎不起作用,它让我 AttributeError: 'Series' 对象没有属性 'stack' (3认同)

jon*_*nas 6

数据类型类别

也许这个功能在这个线程打开时并不存在,但是数据类型“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)
Run Code Online (Sandbox Code Playgroud)

数据框看起来像这样:

   a  b
0  0  0
1  1  1
2  1  0
Run Code Online (Sandbox Code Playgroud)

现在,按 a 和 b 分组

print(df.groupby(["a","b"]).size())
Run Code Online (Sandbox Code Playgroud)

产量:

a  b
0  0    1
   1    0
1  0    1
   1    1
Run Code Online (Sandbox Code Playgroud)

请注意最右边一列中的 0。此行为也记录在pandas 用户指南中(在页面上搜索“groupby”)。

  • 我不需要零的时候就遇到这种情况! (2认同)
  • @Mithril,如果您的意思是您有一个分类列,并且当您只想要观察到的组合时 .groupby 会为您提供所有可能的组合,那么您将需要使用 groupby(..., Observed=True),如此处记录:https ://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#handling-of-un-observed-categorical-values (2认同)