pandas数据框和计数中所选列的唯一值组合

Rat*_*rit 54 python pandas

我在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']})
Run Code Online (Sandbox Code Playgroud)

所以,我的数据看起来像这样

----------------------------
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
-----------------------------
Run Code Online (Sandbox Code Playgroud)

我想将其转换为另一个数据框架.预期的输出可以在以下python脚本中显示:

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})
Run Code Online (Sandbox Code Playgroud)

所以,我的预期输出看起来像这样

--------------------------------------------
index      A       B       count
--------------------------------------------
0         no       no        1
1         no      yes        2
2        yes       no        4
3        yes      yes        3
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

实际上,我可以通过使用以下命令找到所有组合并计算它们: mytable = df1.groupby(['A','B']).size()

然而,事实证明这种组合在一列中.我想将组合中的每个值分成不同的列,并为计数结果再添加一列.有可能吗?我可以提出你的建议吗?先感谢您.

EdC*_*ica 105

你可以groupby上的cols"A"和"B",并呼吁size然后reset_indexrename生成列:

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
Run Code Online (Sandbox Code Playgroud)

更新

稍微解释一下,通过对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
Run Code Online (Sandbox Code Playgroud)

现在要恢复分组列,我们称之为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
Run Code Online (Sandbox Code Playgroud)

这会恢复索引,但是大小聚合会转换为生成的列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
Run Code Online (Sandbox Code Playgroud)

groupby确实接受了as_index我们可以设置的arg ,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
Run Code Online (Sandbox Code Playgroud)


Myk*_*tko 42

value_counts在 Pandas 1.1.0 中,您可以使用DataFrames 的方法:

df.value_counts() # or df[['A', 'B']].value_counts()
Run Code Online (Sandbox Code Playgroud)

结果:

A    B
yes  no     4
     yes    3
no   yes    2
     no     1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

将索引转换为列并按值计数排序:

df.value_counts(ascending=True).reset_index(name='count')
Run Code Online (Sandbox Code Playgroud)

结果:

     A    B  count
0   no   no      1
1   no  yes      2
2  yes  yes      3
3  yes   no      4
Run Code Online (Sandbox Code Playgroud)