Pandas 数据框分组和计数与 Python 中的验证

Posted

技术标签:

【中文标题】Pandas 数据框分组和计数与 Python 中的验证【英文标题】:Pandas dataframe Grouping and Counting with validations in Python 【发布时间】:2020-06-23 08:33:04 【问题描述】:

我目前正在进行分析以执行以下操作:

1.我需要计算“否”每年是否存在 4 个条目。 2018 年和 2019 年的人。应排除同一日期(是否 不管是哪一个)

它应该如下所示:

Year    Gender  No. People 
18      Men         11
        Woman        8
        Not Applied  3
19      Men         14
        Woman        5
        Not Applied  0

No. People 列显示 No. People 的计数。

2。按性别检查过去 10 个月内 10 天内是否存在超过 6 个条目。

结果可能如下所示:

Period                   Gender      Entries
01/23/2019 - 01/15/2019  Men         6
N/A                      Woman       N/A
N/A                      Not Applied N/A

3.查看过去 3 个月的人数是否有 11 项衡量指标

Period                   Gender      Entries
12/20/2018 - 01/23/2019  Men         26
12/20/2018 - 01/23/2019  Woman       13
12/20/2018 - 12/26/2018  Not Applied N/A

不知何故,它看起来很复杂,这就是我在代码中挣扎的原因。

我开始使用以下代码:

import pandas as pd
path = 'path'
filename = 'excel.xls'
final_path = path + '/' + filename
ws_name = 'Sheet1'

df.groupby(df['Date'].dt.year)['No. People'].agg(['count']) 

但不知怎的,我正在为结果或错误而苦苦挣扎。

Excel 中的数据如下所示:

Date    Gender  No. People
12/20/18    Men 4
12/21/18    Men 9
12/22/18    Men 3
12/23/18    Men 9
12/24/18    Men 6
12/25/18    Men 1
12/26/18    Men 3
12/27/18    Men 8
12/28/18    Men 3
12/29/18    Men 5
12/30/18    Men 8
12/31/18    Men 
01/01/19    Men 
01/02/19    Men 
01/03/19    Men 
01/04/19    Men 9
01/05/19    Men 7
01/06/19    Men 5
01/07/19    Men 1
01/08/19    Men 8
01/09/19    Men 5
01/10/19    Men 6
01/11/19    Men 9
01/12/19    Men 7
01/13/19    Men 
01/14/19    Men 
01/15/19    Men 
01/16/19    Men 
01/17/19    Men 
01/18/19    Men 
01/19/19    Men 6
01/20/19    Men 5
01/21/19    Men 2
01/22/19    Men 5
01/23/19    Men 1
12/20/18    Women   6
12/21/18    Women   6
12/22/18    Women   2
12/23/18    Women   2
12/24/18    Women   2
12/25/18    Women   
12/26/18    Women   
12/27/18    Women   
12/28/18    Women   1
12/29/18    Women   1
12/30/18    Women   4
12/31/18    Women   
01/01/19    Women   
01/02/19    Women   
01/03/19    Women   
01/04/19    Women   
01/05/19    Women   
01/06/19    Women   
01/07/19    Women   
01/08/19    Women   
01/09/19    Women   
01/10/19    Women   
01/11/19    Women   
01/12/19    Women   
01/13/19    Women   
01/14/19    Women   
01/15/19    Women   
01/16/19    Women   
01/17/19    Women   
01/18/19    Women   
01/19/19    Women   4
01/20/19    Women   6
01/21/19    Women   8
01/22/19    Women   9
01/23/19    Women   4
12/20/18    Not Applied 6
12/21/18    Not Applied 2
12/22/18    Not Applied 3
12/23/18    Not Applied 
12/24/18    Not Applied 
12/25/18    Not Applied 
12/26/18    Not Applied 

【问题讨论】:

您能准确地展示您尝试过的代码吗?您添加的不完整,例如您调用的 RPO 列是什么?你得到什么错误?你被困在哪里了? @effy 对不起我的错误。我更正了代码 【参考方案1】:

首先,也可以按性别添加分组

df['Date'] = pd.to_datetime(df['Date'])
df.groupby([df['Date'].dt.year, 'Gender'])['No. People'].agg(['count'])

第二个以 10 天为单位进行分组,您可以使用 pandas Grouper 类

df.sort_values(by=['Date'], ascending=False, inplace=True)
from_date = df.iloc[0]['Date'] - pd.DateOffset(months=10)
last_10_months = df[df.Date >= from_date]
count_people = last_10_months.groupby([pd.Grouper(key='Date', freq='10D'), 'Gender']).count()
count_people[count_people['No. People'] > 6]

当月第三个相同

df.sort_values(by=['Date'], ascending=False, inplace=True)
from_date = df.iloc[0]['Date'] - pd.DateOffset(months=3)
last_3_months = df[df.Date >= from_date]
df.groupby(['Gender']).count()
count_people[count_people['No. People'] > 11]

【讨论】:

非常感谢!还有两个问题。是否可以为第二个执行 10 个月的分组,如 10 个月的存储桶,并按照您的定义缩短结果?第三组是 3 个月? 您的意思是按 10 个月分组,然后按 10 天分组?试试df.groupby([pd.Grouper(key='Date', freq='10M'), pd.Grouper(key='Date', freq='10D'), 'Gender']).count() 这就是我一直在寻找的。我只是有更多的问题。我可以限制df.groupby([pd.Grouper(key='Date', freq='10M'), pd.Grouper(key='Date', freq='10D'), 'Gender']).count(),我真的只是看看最后的10M而已吗?我的意思是说 01.01.2019 减去 10 个月,我只会研究 1. März 2018 之前的时期,而不是更进一步。这可能吗? 是的,例如,排序后得到最后日期:df.sort_values(by=['Date'], ascending=False) from_date = df.iloc[0]['Date'] - pd.DateOffset(months=10) df[df.Date > from_date] 谢谢它很接近,我的意思是在 10 天内的近 10M 中,我的人数应该超过 6 个条目

以上是关于Pandas 数据框分组和计数与 Python 中的验证的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas分组聚合

在熊猫数据框中按日期和计数值分组

每月每个类别的分组计数(当前月份与过去几个月的剩余时间)在 pandas 的单独列中

使用 Pandas 计算分组计数时的案例

对 pandas 数据框中的连续值进行分组

用 Pandas 计数和排序