python - 将 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()))
有没有一种简单的方法可以做到这一点?
解决方案
用于: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
。
推荐阅读
- xamarin - Rider 2018.1 iOS 模拟器在构建后未运行
- ios - UIAlertController 在模型类中不起作用
- docker - What does Docker use to host/run web applications?
- android - Android : Galaxy Nexus GT-I9250 在我的布局上崩溃
- php - 将值从锚点发送到弹出窗口
- javascript - Angular: POST http://localhost:4200/undefined/authentication/register 0 () 错误
- python - 使用 Pandas 将多行转换为单行
- java - 使用数据库作为任务队列
- python - Tensorflow LSTM:ValueError:形状必须至少排名3
- python - Telegram Bot API - 上传带有文件名的文档