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]
答案 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])