我在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_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
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)