【问题标题】:Pandas crosstab, but with values from aggregation of third columnPandas 交叉表,但具有来自第三列聚合的值
【发布时间】:2016-09-27 22:05:10
【问题描述】:

这是我的问题:

df = pd.DataFrame({'A': ['one', 'one', 'two', 'two', 'one'] ,
                   'B': ['Ar', 'Br', 'Cr', 'Ar','Ar'] ,
                   'C': [1, 0, 0, 1,0 ]})

我想生成类似pd.crosstab 函数的输出,但是列和行交集的值应该来自第三列的聚合:

    Ar,  Br, Cr
one 0.5 0  0
two 1  0  0

例如有两种情况'one'和'Ar'对应'C'列的值为1,0我们将'C'列中的值相加(0+1)并除以中的值个数列'C',所以我们得到(0 + 1)/ 2 = 0.5。每当组合不存在时,我们(如“Cr”和“one”)我们将其设置为零。有什么想法吗?

【问题讨论】:

    标签: python pandas aggregate


    【解决方案1】:

    您可以使用pivot_table() 方法,该方法默认使用aggfunc='mean'

    In [46]: df.pivot_table(index='A', columns='B', values='C', fill_value=0)
    Out[46]:
    B     Ar  Br  Cr
    A
    one  0.5   0   0
    two  1.0   0   0
    

    【讨论】:

    • 您和 piRSquared 都提供了出色的答案!它们都是正确答案,很难决定给谁给出官方答案标签。我把它给了 piRSquared,因为他/她的排名比你的略低。我希望你不介意。
    • @user1700890,绝对没问题!我也很喜欢他的回答。实际上pivot_table() 在幕后确实做到了这一点(加上一些额外的东西)...... ;)
    【解决方案2】:

    我喜欢groupbyunstack

    df.groupby(['A', 'B']).C.mean().unstack(fill_value=0)
    

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2018-10-31
      • 2017-06-20
      相关资源
      最近更新 更多