Pandas enumerate groups in descending order

Sam*_*mar 3 python group-by dataframe pandas pandas-groupby

I've the following column:

   column
0      10
1      10
2       8
3       8
4       6
5       6
Run Code Online (Sandbox Code Playgroud)

My goal is to find the today unique values (3 in this case) and create a new column which would create the following

   new_column
0           3
1           3
2           2
3           2
4           1
5           1
Run Code Online (Sandbox Code Playgroud)

The numbering starts from length of unique values (3) and same number is repeated if current row is same as previous row based on original column. Number gets decreased as row value changes. All unique values in original column have same number of rows (2 rows for each unique value in this case).

My solution was to groupby the original column and create a new list like below:

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

Run Code Online (Sandbox Code Playgroud)

Then I'd flatten the list sort in decreasing order. Any other simpler solution?

Thanks.

piR*_*red 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
Run Code Online (Sandbox Code Playgroud)

dict.setdefault

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

df.assign(new=len(d) - df.column.map(d))
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

使用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
Run Code Online (Sandbox Code Playgroud)

对于看起来像这样的 DataFrame,

df = pd.DataFrame({'column': [10, 10, 8, 8, 10, 10]})
Run Code Online (Sandbox Code Playgroud)

. . .如果只对连续的值进行分组,您需要修改您的石斑鱼:

(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
Run Code Online (Sandbox Code Playgroud)

  • 这是 `pd.factorize` 和 `np.unique` 之间的巨大差异。`pd.factorize` 不会排序,而 `np.unique` 会排序。@anky_91 (2认同)