4

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

我有一个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

等等

我需要按storeand对这个数据框进行分组day,然后对每个存储日组中的所有 obs 运行一些操作。

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

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

4

3 回答 3

1

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

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

或者

df.groupby(['store', 'day']).count().unstack().fillna(0)
于 2019-01-09T13:52:30.387 回答
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)
于 2016-11-22T16:14:45.760 回答
0

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

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
于 2014-11-11T17:47:44.407 回答