熊猫按降序枚举组

时间:2019-06-23 03:37:01

标签: python pandas dataframe group-by pandas-groupby

我有以下专栏文章:

   column
0      10
1      10
2       8
3       8
4       6
5       6

我的目标是找到今天唯一的值(在本例中为3)并创建一个新列,该列将创建以下内容

   new_column
0           3
1           3
2           2
3           2
4           1
5           1

编号从唯一值的长度(3)开始,如果当前行与基于原始列的前一行相同,则重复相同的编号。随着行值的更改,数字减少。原始列中的所有唯一值都具有相同的行数(在这种情况下,每个唯一值2行)。

我的解决方案是对原始列进行分组,然后创建一个新列表,如下所示:

i=1
new_time=[]
for j, v in df.groupby('column'):
    new_time.append([i]*2)
    i=i+1

然后我将列表排序以降序排列。还有其他更简单的解决方案吗?

谢谢。

5 个答案:

答案 0 :(得分:6)

pd.factorize

i, u = pd.factorize(df.column)
df.assign(new=len(u) - i)

   column  new
0      10    3
1      10    3
2       8    2
3       8    2
4       6    1
5       6    1

dict.setdefault

d = {}
for k in df.column:
    d.setdefault(k, len(d))

df.assign(new=len(d) - df.column.map(d))

答案 1 :(得分:4)

GroupBy.ngroupascending=False一起使用:

df.groupby('column', sort=False).ngroup(ascending=False)+1

0    3
1    3
2    2
3    2
4    1
5    1
dtype: int64

对于看起来像这样的DataFrame,

df = pd.DataFrame({'column': [10, 10, 8, 8, 10, 10]})

。 。 。如果仅将连续值分组,则需要修改您的分组器:

(df.groupby(df['column'].ne(df['column'].shift()).cumsum(), sort=False)
   .ngroup(ascending=False)
   .add(1))

0    3
1    3
2    2
3    2
4    1
5    1
dtype: int64

答案 2 :(得分:2)

尝试使用uniquemap

df.column.map(dict(zip(df.column.unique(),reversed(range(df.column.nunique())))))+1
Out[350]: 
0    3
1    3
2    2
3    2
4    1
5    1
Name: column, dtype: int64

答案 3 :(得分:2)

首先,我们可以使用time.mktime的{​​{1}}方法,即

  

密集:类似于“分钟”,但组之间的排名始终提高1

rank
@ cs95解决方案的

dense版本是

df['column'].rank(method='dense')

0    3.0
1    3.0
2    2.0
3    2.0
4    1.0
5    1.0

答案 4 :(得分:1)

IIUC,您希望反向反转相同值的连续组的groupID。如果是这样,我认为这也应该起作用:

df.column.nunique() - df.column.ne(df.column.shift()).cumsum().sub(1)

Out[691]:
0    3
1    3
2    2
3    2
4    1
5    1
Name: column, dtype: int32