[英]Pandas enumerate groups in descending order
我有以下专栏:
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
然后我按降序排列列表排序。 还有其他更简单的方法吗?
谢谢。
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))
使用GroupBy.ngroup
, ascending=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
尝试使用unique
map
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
实际上,我们可以使用rank
dense
rank
密集 :像'min',但是组之间的等级总是增加1
df['column'].rank(method='dense')
0 3.0
1 3.0
2 2.0
3 2.0
4 1.0
5 1.0
rank
版本的@ cs95解决方案将是
df['column'].ne(df['column'].shift()).cumsum().rank(method='dense',ascending=False)
在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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.