我有这样的数据
import random
import pandas as pd
jobs = ['Agriculture', 'Crafts', 'Labor', 'Professional']
df = pd.DataFrame({
'JobCategory':[random.choice(jobs) for i in range(300)],
'Region':[random.randint(1,5) for i in range(300)],
'MaritalStatus':[random.choice(['Not Married', 'Married']) for i in range(300)]
})
我想要一个简单的表格,显示每个地区的工作数量 .
print(pd.pivot_table(df,
index='JobCategory',
columns='Region',
margins=True,
aggfunc=len))
输出是
MaritalStatus
Region 1 2 3 4 5 All
JobCategory
Agriculture 13.0 23.0 17.0 18.0 8.0 79.0
Crafts 16.0 13.0 18.0 19.0 14.0 80.0
Labor 15.0 11.0 19.0 11.0 14.0 70.0
Professional 22.0 17.0 16.0 7.0 9.0 71.0
All 66.0 64.0 70.0 55.0 45.0 300.0
我假设“MaritalStatus”出现在输出中,因为这是计算计数的列 . 如何根据Region-JobCategory计数让Pandas计算并忽略数据框中的无关列?
在编辑中添加---
我正在寻找一个输出边距值的表 . 我展示的表格中的值是我想要的,但我不希望MaritalStatus成为计算对象 . 如果该列中有Nan,例如将列定义更改为
'MaritalStatus':[random.choice(['Not Married', 'Married'])
for i in range(299)].append(np.NaN)
这是输出(有和没有 values = 'MaritalStatus',
)
MaritalStatus
Region 1 2 3 4 5 All
JobCategory
Agriculture 16.0 14.0 16.0 14.0 16.0 NaN
Crafts 25.0 17.0 15.0 14.0 16.0 NaN
Labor 14.0 16.0 8.0 17.0 15.0 NaN
Professional 13.0 14.0 14.0 13.0 13.0 NaN
All NaN NaN NaN NaN NaN 0.0
4 回答
你可以用0填充nan值,然后找到len
输出:
len
聚合函数计算MaritalStatus
的值沿JobCategory - Region
的特定组合出现的次数 . 因此,你正在计算JobCategory - Region
实例的数量,这正是你所期待的 .如果将数据帧剪切为仅作为最终索引的一部分的列计数行的工作,而不必引用另一列 .
除了没有“MaritialStatus”的行之外,输出与问题中的输出相同 .
编辑
我们可以为每个记录分配键值,并对该值进行计数或调整 .
输出:
您可以添加MaritalStatus作为
values
参数,这将消除列索引中的额外级别 . 使用aggfunc =len
,你选择什么作为值参数并不重要,它将为该聚合中的每一行返回1的计数 .所以,试试:
输出:
选项2
使用
groupby
和size
:输出: