在多个列中指定唯一值

df=pd.DataFrame({'Col1':['Bob','Joe','Bill','Mary','Joe',],
“Col2”:[“乔”、“史蒂夫”、“鲍勃”、“鲍勃”、“史蒂夫”],
'Col3':np.random.random(5)}

返回“Col1”和“Col2”的唯一值的最佳方法是什么

所需输出为

“鲍勃”、“乔”、“比尔”、“玛丽”、“史蒂夫”

pd.unique从输入数组、数据帧列或索引返回唯一值

此函数的输入需要是一维的,因此需要组合多个列。最简单的方法是选择所需的列,然后在平坦的NumPy数组中查看值。整个操作如下所示:

&gt&燃气轮机&燃气轮机;pd.unique(df[['Col1','Col2']].values.ravel('K'))
数组(['Bob','Joe','Bill','Mary','Steve'],dtype=object)

请注意,ravel()是一个数组方法,它返回多维数组的视图(如果可能的话)。参数'K'告诉该方法按元素在内存中的存储顺序展平数组(熊猫通常以Fortran连续顺序存储底层数组;列在行之前)。这比使用该方法的默认“C”顺序要快得多


另一种方法是选择列并将其传递给np.unique

&gt&燃气轮机&燃气轮机;np.unique(df['Col1','Col2']].值)
数组(['Bill','Bob','Joe','Mary','Steve'],dtype=object)

这里不需要使用ravel(),因为该方法处理多维数组。即使如此,这可能比pd.unique慢,因为它使用基于排序的算法而不是哈希表来识别唯一值

对于较大的数据帧,速度上的差异非常显著(特别是在只有少数唯一值的情况下):

&gt&燃气轮机&燃气轮机;df1=pd.concat([df]*100000,忽略_index=True)#具有500000行的数据帧
&燃气轮机&燃气轮机>%timeit np.unique(df1[['Col1','Col2']]值)
1圈,最佳3圈:每圈1.12秒
&燃气轮机&燃气轮机>%timeit pd.unique(df1[['Col1','Col2']].values.ravel('K'))
10个环路,最佳3个:每个环路38.9毫秒
&燃气轮机&燃气轮机>%timeit pd.unique(df1[['Col1','Col2']].values.ravel())#使用C顺序进行ravel
10个回路,最佳3个:每个回路49.9毫秒

发表评论