首页 > 解决方案 > 将 groupby() 组中的每个元素与该组中的唯一值进行比较,并获得相等的位置

问题描述

我有一个数据框,其中包含特定测量的主题和日期。对于每个主题,我想查找该组每一行中的日期是否对应于第一 (1)、第二 (2)、第三 (3)... 该主题的唯一日期值。

为了澄清这是我正在寻找的:

    |subject | date | order|
    |A | 01.01.2020 | 1|
    |A | 01.01.2020 | 1|
    |A | 02.01.2020 | 2|
    |B | 01.01.2020 | 1|
    |B | 02.01.2020 | 2|
    |B | 02.01.2020 | 2|

我虽然关于以下内容,但在 apply 函数中不允许使用 for 循环:

df['order']=df.groupby(['subject']).apply(lambda x: i if x['date']=value for i, value in enumerate(x['date'].unique()))

有没有一种简单的方法可以做到这一点?

标签: pythonpandaspandas-groupbyunique

解决方案


用于:factorize_GroupBy.transform

df['order1']=df.groupby(['subject'])['date'].transform(lambda x: pd.factorize(x)[0]) + 1
print (df)
  subject        date  order  order1
0       A  01.01.2020      1       1
1       A  01.01.2020      1       1
2       A  02.01.2020      2       2
3       B  01.01.2020      1       1
4       B  02.01.2020      2       2
5       B  02.01.2020      2       2

或者您可以使用GroupBy.rank,但有必要将列转换date为日期时间:

df['order2']=df.groupby(['subject'])['date'].rank(method='dense')
print (df)
  subject       date  order  order1
0       A 2020-01-01      1     1.0
1       A 2020-01-01      1     1.0
2       A 2020-02-01      2     2.0
3       B 2020-01-01      1     1.0
4       B 2020-02-01      2     2.0
5       B 2020-02-01      2     2.0

解决方案的区别在于是否更改了日期时间的顺序:

print (df)
  subject       date  order (disregarding temporal order of date)
0       A 2020-01-01      1
1       A 2020-03-01      2 <- changed datetime for sample
2       A 2020-02-01      3
3       B 2020-01-01      1
4       B 2020-02-01      2
5       B 2020-02-01      2

df['order1']=df.groupby(['subject'])['date'].transform(lambda x: pd.factorize(x)[0]) + 1
df['order2']=df.groupby(['subject'])['date'].rank(method='dense')
print (df)
  subject       date  order  order1  order2
0       A 2020-01-01      1       1     1.0
1       A 2020-03-01      1       2     3.0
2       A 2020-02-01      2       3     2.0
3       B 2020-01-01      1       1     1.0
4       B 2020-02-01      2       2     2.0
5       B 2020-02-01      2       2     2.0

总之:如果您不关心date反映在order输出中的时间顺序,请使用第一种方法,或者如果时间顺序很重要并且应该反映在输出中,请使用第二种方法order


推荐阅读