使用Python / Pandas并给定名称-值(Bob),如何按工作和状态对value_count进行计数,并按月列出。初始df:
鲍勃的输出应该是这样的:
我正在处理成千上万条记录,我需要某种方式来检索每个月特定名称的Jobs代码和状态数。
我可以使用.loc和value_counts()单独获取此信息,但不能一次全部获取。 Grouby的统计信息并不具体。有任何想法吗???
答案 0 :(得分:0)
我在您的测试DataFrame中添加了一行(六月):
Name State Job Code Month
0 Bob CA A APR
1 Joe CA B APR
2 Mary AZ C MAY
3 Bob CA D MAY
4 Bob NV C MAY
5 Bob CA D MAY
6 Bob CA D JUN
原因是为了表明我提供“日历”排序的方式 在 Month (而不是字母)上运行就可以了。
要提供提到的“日历”排序方式,请先:
df.Month = pd.Categorical(df.Month, ['JAN', 'FEB', 'MAR', 'APR',
'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'])
然后,几乎所有处理都可以按照以下指令执行:
res = df.query('Name == "Bob"').drop(columns=['Name'])\
.set_index('Month').stack().reset_index(name='val')\
.groupby(['Month', 'level_1', 'val']).size()\
.sort_index(ascending=[True, False, True]).droplevel(1)
此说明很长(涉及多个步骤),因此请理解 它分别运行每个步骤,并查看中间结果。
我之前写过“几乎所有内容”,因为目前MultiIndex不需要 列名。要清除它们,请运行:
res.index.names = ['', '']
最终结果是:
APR CA 1
A 1
MAY CA 2
NV 1
C 1
D 2
JUN CA 1
D 1
dtype: int64
请注意, JUN 的数据应保持不变, MAY 之后。
答案 1 :(得分:0)
我希望获得一张桌子,但是我能够使用groupby和两个.count()方法获得足够的距离。我发现我需要首先将数据帧过滤为仅所需的值(鲍勃)。这似乎很明显,但我是新来的。谢谢大家的帮助。
df1 = df[df['Name'] == 'Bob']
grp1 = df1.groupby(['Month', 'Job Code'])
grp1.count()
grp2 = df1.groupby(['Month', 'State'])
grp2.count()