我有一个基本上像这样的数据框:
A=pd.DataFrame({'Id':[1,1,1,1,2,2,2],'Time'[0,0.5,1.2,1.2,0.2,0.2,0.5]})
idx Id Time
0 1 0.0
1 1 0.5
2 1 1.2
3 1 1.2
4 2 0.2
5 2 0.2
6 2 0.5
7 3 1.7
,我想为每个Id 的时间的不同值分配一个时间顺序索引。因此,基本上,此列应将此特定ID的时间值赋予顺序。此外,具有相同ID和相同时间的条目应具有相同的排序索引。然后,我应该有:
idx Id Time Time_order
0 1 0.0 0
1 1 0.5 1
2 1 1.2 2
3 1 1.2 2
4 2 0.2 0
5 2 0.2 0
6 2 0.5 1
7 3 1.7 0
如何在没有for循环的情况下有效地做到这一点?非常感谢。
答案 0 :(得分:4)
a.sort do |a,b|
[a,b].map {|e| e["name"] == "X" ? 0 : 1 }.zip(
[b["year"],a["year"]],[a["name"],b["name"]]
).reduce(:<=>)
end
和groupby
使用rank
method='dense'
A.assign(Time_order=A.groupby('Id').Time.rank(method='dense') - 1)
idx Id Time Time_order
0 0 1 0.0 0.0
1 1 1 0.5 1.0
2 2 1 1.2 2.0
3 3 1 1.2 2.0
4 4 2 0.2 0.0
5 5 2 0.2 0.0
6 6 2 0.5 1.0
7 7 3 1.7 0.0
,如果您真的想
astype(int)
A.assign(Time_order=A.groupby('Id').Time.rank(method='dense').astype(int) - 1)
idx Id Time Time_order
0 0 1 0.0 0
1 1 1 0.5 1
2 2 1 1.2 2
3 3 1 1.2 2
4 4 2 0.2 0
5 5 2 0.2 0
6 6 2 0.5 1
7 7 3 1.7 0
pd.factorize