熊猫groupby.ngroup()的索引顺序?

时间:2020-09-21 02:49:38

标签: python pandas numpy pandas-groupby

Pandas groupby“ ngroup”功能按“组”顺序标记每个组。

我正在寻找类似的行为,但是需要分配的标签按原始(索引)顺序排列,如何才能有效地做到这一点(大阵列通常会发生这种情况)在熊猫和numpy中发生?

> df = pd.DataFrame(
          {"A": [9,8,7,8,9]},
          index=list("abcde"))
   A
a  9
b  8
c  7
d  8
e  9
> df.groupby("A").ngroup()
a    2
b    1
c    0
d    1
e    2


# LOOKING FOR ###################
a    0
b    1
c    2
d    1
e    0

如何使用单个维度 numpy 数组实现所需的输出?

arr = np.array([9,8,7,8 ,9])
# looking for [0,1,2,1,0]

3 个答案:

答案 0 :(得分:2)

也许更好的方法是factorize

df['A'].factorize()[0]

输出:

array([0, 1, 2, 1, 0])

答案 1 :(得分:1)

您可以将sort=Flase传递给groupby():

df.groupby('A', sort=False).ngroup()

a    0
b    1
c    2
d    1
e    0
dtype: int64

据我所知,groupby中没有numpy的直接等效项。对于纯numpy版本,可以使用numpy.unique()获取唯一值。 numpy.unique()可以选择返回相反的值,基本上是将重新创建输入数组的索引数组,但是它首先对唯一值进行排序,因此结果与使用常规的(已排序的){{1} }命令。

要解决此问题,您可以捕获每个唯一值首次出现的索引值。对索引值进行排序,并将其用作原始数组中的索引,以按其原始顺序获得唯一值。创建一个字典以在唯一值和组号之间映射,然后使用该字典将数组中的值转换为适当的组号。

pandas.groupby()

答案 2 :(得分:1)

您可以使用np.unique-

In [105]: a = np.array([9,8,7,8 ,9])

In [106]: u,idx, tags = np.unique(a, return_index=True, return_inverse=True)

In [107]: idx.argsort().argsort()[tags]
Out[107]: array([0, 1, 2, 1, 0])