【问题标题】:Groupby in pandas, filling in missing groups with []Pandas 中的 Groupby,用 [] 填充缺失的组
【发布时间】:2015-01-08 08:17:19
【问题描述】:

欢迎任何有关此问题更准确标题的帮助..

我有一个 pandas 数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的项目。看起来像这样。

df
store    day   items
 a        1     4
 a        1     3
 a        2     1
 a        3     5
 a        4     2 
 a        5     9
 b        1     1 
 b        2     3

此数据集中的每个观察结果都与一个独特的商店日组合有关,但每个商店日观察结果都以消耗的正数商品为条件列出,即每个商店日对的 df[items] > 0

所以我没有,例如

b         3      0
b         4      0 
b         5      0

等等

我需要按storeday 对这个dataframe 进行分组,然后对每个store-day 组中的所有obs 运行一些操作。

但是,我希望这些行存在并且长度为 0(空集),我不确定执行此操作的最佳方法。这是一个非常简单的玩具数据集。真实的非常大。

我真的不想在使用 df.groupby(['store', 'day']) 之前添加观察结果,因为 我对每个商店日组运行 OTHER 计算,使用每个组的长度作为在特定商店和日期记录的客户数量的度量。因此,如果我将这些观察结果添加到b3b4,那么看起来有 2 位顾客在第 3 天和第 4 天访问了 b 商店——实际上没有(每个人在第 3 天和 b 商店什么都没买) 4)。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    您的问题可能已经有了答案,以防其他人(例如我)正在寻找答案。试试:

    pd.crosstab(df.store, df.day, margins=False)
    

    这将为您提供 df,其中 store 作为索引,day 作为列。你可以这样做:

    df.reset_index(level=0, inplace=True) 
    

    将索引转换为列,如果您有多个索引列,例如:

    df.columns = [''.join(col).strip() for col in df.columns.values]
    

    得到一个“平坦”的df。

    你可以这样做:

    pd.crosstab([df.store, df.day.....], [df.store, df.day.....],margins=False)
    

    【讨论】:

      【解决方案2】:

      我不知道存储零值的最佳方式,但您可以在聚合时创建它们:

      df.pivot_table('items', 'store', 'day', fill_value=0, aggfunc='count')
      

      df.groupby(['store', 'day']).count().unstack().fillna(0)
      

      【讨论】:

        【解决方案3】:

        表示这些的“熊猫”方式可能是将其编码为缺失数据,例如:

        In [562]: df
        Out[562]: 
          store  day  items
        0     a    1      4
        1     a    1      3
        2     a    2      1
        3     a    3      5
        4     a    4      2
        5     a    5      9
        6     b    1      1
        7     b    2      3
        8     b    3    NaN
        9     b    4    NaN
        

        然后,在统计客户时,您可以使用排除缺失值的count,例如:

        In [565]: df.groupby('store')['items'].count()
        Out[565]: 
        store
        a        6
        b        2
        Name: items, dtype: int64
        

        编辑:

        在添加缺失值方面,这里有几个想法。假设您有一个仅包含缺失对的 DataFrame,如下所示:

        In [571]: df_missing
        Out[571]: 
          store  day
        8     b    3
        9     b    4
        

        然后您可以将这些附加到您现有的 DataFrame 以填补缺失,如下所示:

        In [574]: pd.concat([df, df_missing], ignore_index=True)
        Out[574]: 
           day  items store
        0    1      4     a
        1    1      3     a
        2    2      1     a
        3    3      5     a
        4    4      2     a
        5    5      9     a
        6    1      1     b
        7    2      3     b
        8    3    NaN     b
        9    4    NaN     b
        

        或者,如果您的 DataFrame 包含您“应该”拥有的对(a 1-5,b 1-4),您可以将其与数据合并以填补缺失。例如:

        In [577]: df_pairs
        Out[577]: 
          store  day
        0     a    1
        1     a    1
        2     a    2
        3     a    3
        4     a    4
        5     a    5
        6     b    1
        7     b    2
        8     b    3
        9     b    4
        
        In [578]: df_pairs.merge(df, how='left')
        Out[578]: 
           store  day  items
        0      a    1      4
        1      a    1      3
        2      a    1      4
        3      a    1      3
        4      a    2      1
        5      a    3      5
        6      a    4      2
        7      a    5      9
        8      b    1      1
        9      b    2      3
        10     b    3    NaN
        11     b    4    NaN
        

        【讨论】:

        • 数据要复杂得多(很多天和很多商店),你知道我怎样才能轻松地添加缺失的观察结果吗?
        • 查看编辑以了解如何处理几种情况。
        • 如何从原始数据集创建 df_pairs?
        • 这需要一些对应该是什么的知识。对于您的示例,您可以使用来自itertoolsproduct,如下所示:df_pairs = pd.DataFrame(list(product('a', range(1,6))) + list(product('b', range(1,5))), columns=['store', 'day'])
        • 嗯,这给了我 TypeError: cannot perform reduce with flexible type
        猜你喜欢
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 2017-05-08
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        相关资源
        最近更新 更多