【问题标题】:Count of values grouped per month, year - Pandas每月、每年分组的值计数 - Pandas
【发布时间】:2019-09-07 14:45:54
【问题描述】:

我正在尝试 groupby 在特定输出中计算每月和每年的日期。我可以每天做,但每个月/年不能得到相同的输出。

d = ({
    'Date' : ['1/1/18','1/1/18','2/1/18','3/1/18','1/2/18','1/3/18','2/1/19','3/1/19'],                 
    'Val' : ['A','B','C','D','A','B','C','D'],                                      
     })

df = pd.DataFrame(data = d)

df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')

df['Count_d'] = df.Date.map(df.groupby('Date').size())

这是我想要的输出:

        Date Val  Count_d
0 2018-01-01   A        2
1 2018-01-01   B        2
2 2018-01-02   C        1
3 2018-01-03   D        1
4 2018-02-01   A        1
5 2018-03-01   B        1
6 2019-01-02   C        1
7 2019-01-03   D        1

当我尝试做类似但每月和每年的事情时,我会使用以下内容:

df1 = df.groupby([df['Date'].dt.year.rename('year'), df['Date'].dt.month.rename('month')]).agg({'count'})
print(df)

但是输出是:

            Date   Val
           count count
year month            
2018 1         4     4
     2         1     1
     3         1     1
2019 1         2     2

预期输出:

        Date Val  Count_d Count_m Count_y
0 2018-01-01   A        2       4       6
1 2018-01-01   B        2       4       6
2 2018-01-02   C        1       4       6
3 2018-01-03   D        1       4       6
4 2018-02-01   A        1       1       6
5 2018-03-01   B        1       1       6
6 2019-01-02   C        1       2       2
7 2019-01-03   D        1       2       2

【问题讨论】:

    标签: python pandas group-by count transform


    【解决方案1】:

    GroupBy.transform 用于与原始DataFrame 大小相同的列:

    df['Date'] = pd.to_datetime(df['Date'], format= '%d/%m/%y')
    y = df['Date'].dt.year
    m = df['Date'].dt.month
    
    df['Count_d'] = df.groupby('Date')['Date'].transform('size')
    df['Count_m'] = df.groupby([y, m])['Date'].transform('size')
    df['Count_y'] = df.groupby(y)['Date'].transform('size')
    
    print(df)
            Date Val  Count_d  Count_m  Count_y
    0 2018-01-01   A        2        4        6
    1 2018-01-01   B        2        4        6
    2 2018-01-02   C        1        4        6
    3 2018-01-03   D        1        4        6
    4 2018-02-01   A        1        1        6
    5 2018-03-01   B        1        1        6
    6 2019-01-02   C        1        2        2
    7 2019-01-03   D        1        2        2
    

    【讨论】:

    • 刚刚发现他们正在使用 dict 删除 agg。知道为什么吗?
    • @anky_91 - 因为与原始 df 相同大小的列。
    • 你在哪里看到@anky_91
    • @Erfan 收到了未来的警告。我猜我执行错了,jez 说得很清楚
    【解决方案2】:

    您可以通过pd.Grouper 做到这一点

    df['Count_d'] = df.groupby([pd.Grouper(key='Date', freq='D')])['Date'].transform('size').astype(int)
    df['Count_m'] = df.groupby([pd.Grouper(key='Date', freq='M')])['Date'].transform('size').astype(int)
    df['Count_y'] = df.groupby([pd.Grouper(key='Date', freq='Y')])['Date'].transform('size').astype(int)
    

    这会给

            Date Val  Count_d  Count_m  Count_y
    0 2018-01-01   A        2        4        6
    1 2018-01-01   B        2        4        6
    2 2018-01-02   C        1        4        6
    3 2018-01-03   D        1        4        6
    4 2018-02-01   A        1        1        6
    5 2018-03-01   B        1        1        6
    6 2019-01-02   C        1        2        2
    7 2019-01-03   D        1        2        2
    

    您可以使用它对各种不同的频率进行分组,请参阅documentation on DateOffsets

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2021-12-18
      • 1970-01-01
      • 2013-11-28
      • 2021-11-14
      • 1970-01-01
      • 2021-09-21
      • 2022-08-18
      • 1970-01-01
      相关资源
      最近更新 更多