gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:46 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com