如何创建唯一值计数的摘要表?

时间:2016-02-23 00:07:55

标签: 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

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

                 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的枢轴表连接更加困难groupby

我希望有一种方法可以使用pivot_table(False, 0)来获得我想要的东西,而不会生成这些子表格并将它们连接起来,但到目前为止我还没有找到它。使用多个索引列进行透视会导致表格过于细化(我不希望(bool_flag, int_flag)group个值计数,例如,每个groupby('group').agg(f)中的每个唯一值的计数{{ 1}}。)

我还尝试使用f,我在其中定义value_counts()以产生在每个系列上调用agg的结果。但是,DataFrame与返回prepareForSegue s。

的函数不兼容

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:2)

实际上,我并不认为我所要求的是可能的。通过执行以下操作,将上面显示的两个数据透视表的索引设置为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

不幸的是,这让我可以选择将索引级别重置为普通列,而不能正常打印。

希望这有助于某人!