Python / Pandas,基于多个值计算特定值

时间:2019-09-28 19:53:59

标签: python pandas dataframe

使用Python / Pandas并给定名称-值(Bob),如何按工作和状态对value_count进行计数,并按月列出。初始df:

enter image description here

鲍勃的输出应该是这样的:

enter image description here

我正在处理成千上万条记录,我需要某种方式来检索每个月特定名称的Jobs代码和状态数。

我可以使用.loc和value_counts()单独获取此信息,但不能一次全部获取。 Grouby的统计信息并不具体。有任何想法吗???

2 个答案:

答案 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()