我搜索了许多其他 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
更难。
我希望有一种方法可以使用 groupby
或 pivot_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/