【问题标题】:Aggregate using values within a column使用列中的值进行聚合
【发布时间】:2021-10-09 23:33:37
【问题描述】:

我有一个数据框:

Region Month
0 AB 1
1 AB 1
2 AB 2
3 BC 3
4 BC 4
5 BC 5

如何将此数据框转换为下面的区域,其中区域的不同值是列,每个月的不同值是行。这些值是区域/月份组合的所有立场的计数总和。因为我有一个地区和月份的列表,所以我也可以将它们指定为一个列表,只要它给我下面的视图。

我使用了df.groupby(['Region', 'Month'], as_index=True).agg({"Month": "count"}),但是布局不同,月份是一列而不是下面的布局。

AB BC
JAN 2 0
FEB 1 0
MAR 0 1
APR 0 1
MAY 0 1
JUN 0 0
JUL 0 0
AUG 0 0
SEP 0 0
OCT 0 0
NOV 0 0
DEC 0 0

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    更新:

    df_out = pd.crosstab(df['Month'], df['Region'])
    df_out.index = df_out.index.map(dict(enumerate(calendar.month_abbr)))
    df_out = df_out.reindex(calendar.month_abbr, fill_value=0)
    print(df_out)
    

    输出:

    Region  AB  BC
    Month         
             0   0
    Jan      2   0
    Feb      1   0
    Mar      0   1
    Apr      0   1
    May      0   1
    Jun      0   0
    Jul      0   0
    Aug      0   0
    Sep      0   0
    Oct      0   0
    Nov      0   0
    Dec      0   0
    

    让我们试试这个:

    import calendar
    
    indx = [m.upper() for m in calendar.month_abbr[1:]]
    
    pd.crosstab(df['Month'], df['Region']).reindex(indx, fill_value=0)
    

    输出:

    Region  AB  BC
    Month         
    JAN      2   0
    FEB      1   0
    MAR      0   1
    APR      0   1
    MAY      0   1
    JUN      0   0
    JUL      0   0
    AUG      0   0
    SEP      0   0
    OCT      0   0
    NOV      0   0
    DEC      0   0
    

    详情:

    使用pd.crosstab按地区获取每月计数,使用日历库,我们可以按顺序获取所有月份缩写的列表,并从pd.crosstab中填写结果数据框的缺失值。

    【讨论】:

    • 谢谢,我的月份值实际上是数字(即 1 = JAN,2 = FEB)。我是否首先使用替换函数替换值(以便它们与日历值完全匹配)才能正常工作?
    • @BKB 很抱歉,但我不明白。您能否以您使用的格式提供示例输入。
    • 对造成的混乱表示歉意。我已经更新了原始帖子 - 月份实际上是数字格式而不是字母。
    • @BKB 查看更新
    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多