【问题标题】:Pandas Pivot Table Nested AggfuncPandas 数据透视表嵌套 Aggfunc
【发布时间】:2019-10-08 15:47:52
【问题描述】:

我正在尝试创建一个数据透视表来计算表单的数量以及该计数的总和、平均值和中位数。但是,Forms dtype 是分类的,我不能对非数字值使用均值和中值函数。

我想使用“表单类型”:计数作为我的聚合值。

如果我将平均值包含在第一个 aggfunc 中,我会收到此错误

DataError: No numeric types to aggregate

有没有办法在数据透视表中嵌套 aggfuncts 或在创建数据透视表时更改 dtype?

我尝试过使用 .astype(int) 但我似乎无法弄清楚该函数的语法。

下面的虚拟代码并不完全准确,但我可以继续努力。

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
                   "C": ["105319", "1271075", "84565", "84354", "54835", "81638", "1282224", "41856", "78987"],
                   "Form Type": ["144", "D", "D/A", "144", "D", "D", "D", "S-1","D"]})
table = pd.pivot_table(df, columns = ['Form Type'],
                       index=['A', 'B', 'C'],
                       fill_value =' ', 
                       aggfunc={'Form Type': ['count']})

输出看起来与此类似

【问题讨论】:

  • 如果您可以提供最小的虚拟代码,我们可以为您提供更好的帮助。 5-10 条记录应该可以工作。
  • @JeromeMontino 是您所需要的输出,还是您事先需要代码?
  • 您应该定义values 即您实际想要聚合的列。 pandas.pydata.org/pandas-docs/stable/reference/api/…
  • 包含一个您希望输出外观的示例可能会有所帮助。

标签: python pandas pivot-table


【解决方案1】:

使用.value_counts() 计算Form Type

  • 这假设您要查询Form Type 的计数,然后您需要countsmeanmediansum
import pandas as pd

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two", "one", "one", "two", "two"],
                   "C": ["105319", "1271075", "84565", "84354", "54835", "81638", "1282224", "41856", "78987"],
                   "Form Type": ["144", "D", "D/A", "144", "D", "D", "D", "S-1","D"]})


counts = df['Form Type'].value_counts().rename_axis('Form Type').reset_index(name='counts')

Form Type  counts
        D       5
      144       2
      S-1       1
      D/A       1

counts['counts'].agg(['mean', 'median', 'sum'])

# Output:
mean      2.25
median    1.50
sum       9.00
Name: counts, dtype: float64

替代方案:

  • 如果你想得到基于groupby.value_counts
grouped_counts = df.groupby(['A', 'B'])['Form Type'].value_counts().rename_axis(['A', 'B', 'Form Type']).reset_index(name='counts')

   A    B Form Type  counts
 bar  one         D       2
 bar  two         D       1
 bar  two       S-1       1
 foo  one       144       1
 foo  one         D       1
 foo  one       D/A       1
 foo  two       144       1
 foo  two         D       1

grouped_counts_stats = grouped_counts.groupby(['A', 'B', 'Form Type'])['counts'].agg(['mean', 'median', 'sum'])

【讨论】:

  • 我想使用表单类型作为我要聚合的列,但使用表单的计数来获取平均值、中位数和总和。但是,我不能在列上应用 .astype 函数,因为在我调用 df 后它没有显示出来。我将扩展我的虚拟代码。
  • 哦,我没有,我刷新看到了。我会试试这个。谢谢。
  • 我正在使用 grouped_counts 行获得TypeError: 'list' object is not callable。我也会听从您的建议,并为所需的输出拍照。
  • 出于某种原因,我不得不使用df.rename(columns{}) 而不是.rename_axis。在那之后它起作用了。
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2016-09-07
  • 1970-01-01
  • 2021-07-22
相关资源
最近更新 更多