当前位置: 首页 > 知识库问答 >
问题:

熊猫中的Groupby,用[]填充缺失的组

臧欣怿
2023-03-14

欢迎提供任何关于这个问题更准确标题的帮助。。

我有一个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[物品]

所以我没有比如说

b         3      0
b         4      0 
b         5      0

我需要按storeday对该数据帧进行分组,然后对每个store day组中的所有OB运行一些操作。

但是,我希望这些行存在并且长度为0(空集),我不确定这样做的最佳方式。这是一个非常简单的玩具数据集。真正的那个很大。

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


共有3个答案

宰父单弓
2023-03-14

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

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

然后,您可以将这些数据添加到现有的数据帧中,以填充缺少的数据帧,如下所示:

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

或者,如果您使用“应该”拥有的对(A1-5,B1-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
惠诚
2023-03-14

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

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

df.groupby(['store', 'day']).count().unstack().fillna(0)
通正平
2023-03-14

你可能已经有了问题的答案,以防有人像我一样在寻找答案。尝试:

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

这将为您提供以store为索引,以day为列的df。

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)
 类似资料:
  • 假设我有以下数据。 我想用以前的值填充缺少的日期(按字段“g”分组)。例如,我想在上面的示例中添加以下主菜: 我该怎么做呢?

  • 问题内容: 我正在尝试使用具有相似列值的行来估算值。 例如,我有这个数据框 我想使用相似的列[‘one’]和[‘two’]的键,并且如果列[‘three’]并非完全是nan,则从具有相似的键的行中插值[ ‘3’] 这是我的愿望结果 您会看到键1和3不包含任何值,因为现有值不存在。 我试过使用groupby fillna() 这给了我一个错误。 我尝试了正向填充,这给了我一个相当奇怪的结果,那就是它

  • 问题内容: 我有一个数据框架,如下所示 我想做的是在date列中找到最小和最大日期,并扩展该列使其具有所有日期,同时为该列填写。所以所需的输出是 问题答案: 初始数据框: 首先,将日期转换为日期时间: 然后,生成日期和唯一用户: 这将允许您创建一个MultiIndex: 您可以使用它来重新索引您的DataFrame: 然后可以按用户排序:

  • 我有一个缺少“SNAP_ID”值的数据帧。我想根据前一个非缺失值(lag()?)的序列,用浮点值填充缺失值。如果可能的话,我真的想只用dplyr来实现这一点。 假设: 永远不会有丢失的数据,因为第一行或最后一行我根据数据集的最小值和最大值之间的缺失天数生成缺失的日期 数据集中可能存在多个空白 当前数据: 我想要实现的目标: 作为数据帧: 这是我实现这个目标的尝试,但它只适用于第一个缺失的值: 来自

  • 问题内容: 我正在分析一个时间序列,并基于某些条件,我可以挑选出事件 开始 或 结束 的行。此时,我的系列看起来像这样(为简洁起见,我省略了一些重复的值): 设置 这是我想要实现的( 理想情况下没有循环) 这是我尝试过的 通过对数据质量的一些乐观假设,我可以获得如下 事件编号 : 然后,我可以将其恢复到原始数据框,并使用 问题 如您所见,事件之间的时间(01:20到02:20)与事件#1相关联。

  • 问题内容: in Pandas中in的功能到底是什么? 问题答案: 当你什么都不懂的时候是你的朋友。它清除了很多次疑问。 看一看: 输出: 当您使用的键将成为新数据框中的索引时。 将列设置为索引时,将获得以下好处: 速度。 当您基于索引列过滤值时,例如 ,因为索引列的散列会更快。不必遍历整个列即可找到。它将只计算的哈希值,并在1 go内找到它。 缓解。 当您可以使用较短和较快的语法,而不是较长和较