python - 如何创建唯一值计数的汇总表?

标签 python pandas dataframe pivot-table

我搜索了许多其他 SO 帖子来寻找这个问题的答案,但还没有找到我正在寻找的东西。开始了:

假设我们有一个如下所示的数据框:

In [7]: df.head(5)
Out[7]:
  bool_flag   group  int_flag
0     False  bottom         0
1     False     mid         1
2     False     top         1
3     False     top         0
4     False    high         1

其中有五个唯一的组、两个唯一的 bool 值和两个唯一的整数值。我想创建一个这样的汇总表:

                 bottom   low  mid  high  top
bool_flag  true       5     32   2    12    4
          false       2     42   7     2   10
int_flag      0       1     10  15     3    8 
              1      10     31  14     0    1

汇总每个非 group 列的唯一值计数,并分组到 group 的列中。

我已经接近了。以下 pivot_table 命令为我提供了类似于我想要的组件的表。

In [8]: pd.pivot_table(df.drop('bool_flag', axis=1), columns=['group'], index=['int_flag'], aggfunc=len)
Out[8]:
group     bottom  high  low  mid  top
int_flag
0             15    11    8   13   13
1             12     5    8    9    6


In [9]: pd.pivot_table(df.drop('int_flag', axis=1), columns=['group'], index=['bool_flag'], aggfunc=len)
Out[9]:
group      bottom  high  low  mid  top
bool_flag
False          19    14   15   18   16
True            8     2    1    4    3

但是,结果表的 index 不是我想要的 Multiindex,因此需要将该数据透视表与 bool_flag 更难。

我希望有一种方法可以使用 groupbypivot_table 来获得我想要的内容,而无需生成这些子表格并将它们连接起来,但到目前为止我还没有没能找到。使用多个索引列进行透视会导致表格过于细化(我不希望 (bool_flag, int_flag) 值的 (False, 0) 对计数,例如,只是每个 group 中每个唯一值的计数。)

我还尝试使用 groupby('group').agg(f),其中我定义了 f 以产生调用 value_counts() 的结果 在每个系列上。但是,agg 与返回 DataFrame 的函数不兼容。

如有任何建议,我们将不胜感激!

最佳答案

实际上,我不认为我所要求的是可能的。通过执行以下操作,将我上面显示的两个数据透视表的索引设置为 MultiIndex:

x = pd.pivot_table(df.drop('int_flag', axis=1), columns=['group'], index=['bool_flag'], aggfunc=len)
y = pd.pivot_table(df.drop('bool_flag', axis=1), columns=['group'], index=['int_flag'], aggfunc=len)

def multiindex_from_pivot_result(df):
    return pd.MultiIndex.from_tuples([(df.index.name, val) for val in df.index], names=['feature', 'values'])

xx = x.set_index(multiindex_from_pivot_result(x))
yy = y.set_index(multiindex_from_pivot_result(y))

生成的表格如下所示:

group             bottom  high  low  mid  top
feature   values
bool_flag False       19    14   15   18   16
          True         8     2    1    4    3

group            bottom  high  low  mid  top
feature  values
int_flag 0           15    11    8   13   13
         1           12     5    8    9    6

然而,像这样连接它们

pd.concat([yy, xx])

生成一个包含我想要的值的表,但其索引的第二级被第一帧的索引值覆盖。

In [24]: pd.concat([yy, xx])
Out[24]:
group             bottom  high  low  mid  top
feature   values
int_flag  0           15    11    8   13   13
          1           12     5    8    9    6
bool_flag 0           19    14   15   18   16
          1            8     2    1    4    3

不幸的是,这使我不得不选择将索引的该级别重置为普通列,这不会很好地打印。

希望这对某人有所帮助!

关于python - 如何创建唯一值计数的汇总表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566414/

相关文章:

python - 在 Python 中读取文件时的编码问题

Python按索引连接数据框

Python 字符串格式 - 限制字符串长度,但修剪字符串开头

python - 如何使用 Pandas 日期时间对象系列作为独立值 (x) 运行 OLS 回归

python - 绘制 dataFrame 中所有值的直方图

python - pandas:在 groupby 时为每个子组添加总行(特别是对于非加法方法,例如 `nunique` )

Python-将人类时间量转换为秒

python - 应用和 Lambda 函数 - ValueError : The truth value of a Series is ambiguous. 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

python - Pandas:如何计算按 ID 分组的分类特征的出现次数

dataframe - 从 DataFrame 或 JuliaDB 表中获取列名