当前位置: 首页 > 知识库问答 >
问题:

为熊猫透视表中的每个值列定义aggfunc

鲍国兴
2023-03-14

正在尝试生成包含多个“值”列的透视表。我知道我可以使用aggfunc以我想要的方式聚合值,但如果我不想对两列求和或平均,而是希望一列求和,而另一列求平均值,该怎么办。那么,有没有可能用熊猫来做呢?

df = pd.DataFrame({
          'A' : ['one', 'one', 'two', 'three'] * 6,
          'B' : ['A', 'B', 'C'] * 8,
          'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
          'D' : np.random.randn(24),
          'E' : np.random.randn(24)
})

现在,这将得到一个带有和的透视表:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum)

这意味着:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean)

我怎么能得到DE的平均值?

希望我的问题足够清楚。

共有3个答案

王季萌
2023-03-14
table = pivot_table(df, values=['D', 'E'], index=['A', 'C'],
                aggfunc={'D': np.mean,'E': np.sum})

表D E平均值A C酒吧大5.500000 7.500000小5.500000 8.500000 foo大2.000000 4.500000小2.333333 4.333333

哈襦宗
2023-03-14

您可以连接两个数据帧:

>>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum)
>>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean)
>>> pd.concat((df1, df2), axis=1)
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

或者,您可以将函数列表作为aggfunc参数传递,然后重新索引:

>>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean])
>>> df3
        sum                mean          
          D         E         D         E
B                                        
A  1.810847 -4.193425  0.226356 -0.524178
B  2.762190 -3.544245  0.345274 -0.443031
C  0.867519  0.627677  0.108440  0.078460
>>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]]
>>> df3.columns = ['D', 'E']
>>> df3
          D         E
B                    
A  1.810847 -0.524178
B  2.762190 -0.443031
C  0.867519  0.078460

当然,如果能为每一列单独定义aggfunc,那就太好了。不知道怎么做,可能会被传递到aggfuncdict-like参数,比如{'D':np.mean,'E':np.sum}

实际上,在您的情况下,您可以手动旋转:

>>> df.groupby('B').aggregate({'D':np.sum, 'E':np.mean})
          E         D
B                    
A -0.524178  1.810847
B -0.443031  2.762190
C  0.078460  0.867519
罗浩然
2023-03-14

您可以通过传递判决将特定函数应用到特定列。

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean})
 类似资料:
  • 问题内容: 如果我在Pandas中有一个DataFrame,看起来像这样: 如何从每一行中获取第一个非空值?例如,上面我想得到:(或等效的Series)。 问题答案: 这是一种非常麻烦的方法,首先用于获取有效列,将返回的序列转换为数据框,以便我们可以逐行调用并将其索引回原始df: 编辑 稍微干净一点的方法:

  • 我正在尝试将列中的值透视到列标题,但保留其余数据。这是我的完整代码,以及我能得到的最接近我正在寻找的内容。唯一的问题是我无法弄清楚如何保留列: 原始数据帧: 我最近的支点尝试: 电流输出: 期望输出: 这个和这个我都试过了,没有成功。 任何帮助都将不胜感激。

  • 问题内容: 阅读完之后:http : //pandas.pydata.org/pandas- docs/version/0.13.1/genic/pandas.DataFrame.sort.html 我似乎仍然无法弄清楚如何通过自定义列表对列进行排序。显然,默认排序是字母顺序的。我举一个例子。这是我的(非常删节的)数据帧: 我希望能够按播放器,年份和Tm进行排序。按玩家和年份的默认排序对我来说是正

  • 问题内容: 在 pandas groupby上发布了一个新的更通用的问题:每个组中的前3个值并存储在DataFrame中,并且在那里已经找到了可行的解决方案。 在此示例中,我创建了一个数据帧,其中的一些随机数据间隔为5分钟。我想创建一个数据框( df分组 ),其中列出了每小时的 3个最高值 。 即:从这一系列价值 我非常接近解决方案,但我找不到最后一步的正确语法。我到现在为止()的结果是: 我想从

  • 问题内容: 我已经看到了将一个列/系列分解为Pandas数据框的多个列的主题的几种变体,但是我一直在尝试做点事情,而实际上并没有成功地使用现有方法。 给定这样的一个DataFrame: 我想将系列中的项目转换为以值作为值的列,如下所示: 我觉得这应该是相对简单的事情,但是由于卷积水平的提高,我已经为此花了几个小时不停地努力,但没有成功。 问题答案: 有几种方法: 使用: 使用: 使用后跟:

  • 我试图基于单个条件,根据多列中的值过滤数据帧,但保留我根本不想应用过滤器的其他列。 我回顾了这些答案,第三个是最接近的,但仍然没有运气: 如何按多列筛选数据帧 筛选多个列 Python熊猫-如何按一个值筛选多个列 设置: 电流输出: 期望输出: 我试过: 以及许多其他变体(,,