我将数据存储在pandas数据框中,如下所示:
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'], 'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})
所以,我的数据看起来像这样
---------------------------- index A B 0 yes yes 1 yes no 2 yes no 3 yes no 4 no yes 5 no yes 6 yes no 7 yes yes 8 yes yes 9 no no -----------------------------
我想将其转换为另一个数据框。预期的输出可以在以下python脚本中显示:
output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})
因此,我的预期输出如下所示
-------------------------------------------- index A B count -------------------------------------------- 0 no no 1 1 no yes 2 2 yes no 4 3 yes yes 3 --------------------------------------------
实际上,我可以使用以下命令来找到所有组合并对其进行计数: mytable = df1.groupby(['A','B']).size()
mytable = df1.groupby(['A','B']).size()
但是,事实证明,此类组合在单个列中。我想将组合中的每个值分隔到不同的列中,并且还要为计数结果增加一列。有可能这样做吗?请问您有什么建议吗?先感谢您。
你可以groupby上的cols“A”和“B”和呼叫size,然后reset_index和rename生成列:
groupby
size
reset_index
rename
In [26]: df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'}) Out[26]: A B count 0 no no 1 1 no yes 2 2 yes no 4 3 yes yes 3
更新
简要说明一下,通过将2列分组,将A和B值相同的行分组,我们称之为size返回唯一组数:
In[202]: df1.groupby(['A','B']).size() Out[202]: A B no no 1 yes 2 yes no 4 yes 3 dtype: int64
现在,要还原分组的列,我们调用reset_index:
In[203]: df1.groupby(['A','B']).size().reset_index() Out[203]: A B 0 0 no no 1 1 no yes 2 2 yes no 4 3 yes yes 3
这将还原索引,但是大小聚合将变成生成的column 0,因此我们必须重命名此名称:
0
In[204]: df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'}) Out[204]: A B count 0 no no 1 1 no yes 2 2 yes no 4 3 yes yes 3
groupby确实接受了as_index我们可以设置为的arg ,False因此它不会使分组的列成为索引,但是这会生成a,series并且您仍然必须还原索引,依此类推....:
as_index
False
series
In[205]: df1.groupby(['A','B'], as_index=False).size() Out[205]: A B no no 1 yes 2 yes no 4 yes 3 dtype: int64