首页 > 解决方案 > Python/Pandas,根据多个值计算特定值

问题描述

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

在此处输入图像描述

Bob 的输出应该是这样的:

在此处输入图像描述

我正在处理数千条记录,我需要某种方法来检索每个月特定名称的工作代码和状态的数量。

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

标签: pythonpandasdataframe

解决方案


我在您的测试 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

原因是为了表明我在月份(而不是字母顺序)上提供“日历”排序的方式可以正常工作。

要提供提到的“日历”排序,请从以下内容开始:

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之后,正如它应该的那样。


推荐阅读