python - 查找每组的唯一项目数

标签 python pandas dataframe

我有一个 df A 看起来像,

type    number    date 
1       1         2017-10-01
2       1         2017-10-31
1       2         2017-09-01
1       2         2017-08-01
2       2         2017-06-01

首先,我想按 number 分组并选择每个组至少需要包含 1 行 type == 1 和一行 type = = 2;为此,我首先检查每个组的大小必须 > 2,

g = A.groupby('number')
B = g.filter(lambda x: len(x) > 1) # df B gets the filter results on g  

但我不知道如何检查上面获取的每个组中是否包含 type12

其次,基于从步骤 1 中获取的组,我想在 A 中创建一个名为 type_2_before_type_1 的 bool 列,它被赋值为 True 如果 type 1 的最早 date 减去 type 2 的最早 date 是 <0 对于每个组,否则为 False。由于每个组中可能有很多行 type == 1 和许多行 type == 2 (如何获取 g['A']. transform('min') 类型 1 和类型 2 行?)。所以结果 df A 看起来像,

type    number    date         type_2_before_type_1
1       1         2017-10-01   True
2       1         2017-10-31   True
1       2         2017-09-01   False
1       2         2017-08-01   False
2       2         2017-06-01   False

例如对于 number == 2 的组,类型 1 的最早日期 2017-08-01 减去类型 2 的最早日期 2017-06-01,结果在 61 天;因此将 False 设置为 type_2_before_type_1

最佳答案

对于第一部分,使用groupby + nunique -

df.groupby('number').type.transform('nunique')

0    2
1    2
2    2
3    2
4    2
Name: type, dtype: int64

df = df[df.groupby('number').type.transform('nunique').gt(1)]

   type  number        date
0     1       1  2017-10-01
1     2       1  2017-10-31
2     1       2  2017-09-01
3     1       2  2017-08-01
4     2       2  2017-06-01

第二部分有点挑战,但是你可以groupbyunstack,调用diff然后得到一个mask -

df['type_2_before_type_1'] = \
 df.groupby(['number', 'type'])\
      .first()\
      .unstack()\
      .diff(-1, axis=1)\
      .iloc[:, 0]\
      .reindex(df.number)\
      .astype(int)\
      .lt(0)\
      .values

df

   type  number       date  type_2_before_type_1
0     1       1 2017-10-01                  True
1     2       1 2017-10-31                  True
2     1       2 2017-09-01                 False
3     1       2 2017-08-01                 False
4     2       2 2017-06-01                 False

关于python - 查找每组的唯一项目数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892479/

相关文章:

pandas - 将 Spark 数据帧转换为 Pandas/R 数据帧的要求

Python HTML 解析,获取标签名称及其值

python - 在 numpy 数组函数之后获取 Dataframe 的索引

python - 将一些列转换为 float

r - 使用表格时选择数据框中最频繁的元素

python - Pandas - 合并两个数据帧后创建多值字段

python - 根据重复条目条件过滤数据帧

python - 在 re.sub 替换模式中处理对捕获组的反向引用

python - 列为字典中的值,获取最长列表的键

python - 如何使用多个工作表和不同工作表名称 pandas 将 dfs 导出到 Excel