我有一个 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
但我不知道如何检查上面获取的每个组中是否包含 type
值 1
和 2
。
其次,基于从步骤 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
第二部分有点挑战,但是你可以groupby
,unstack
,调用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/