我有一个pandas数据框。我想按升序打印其中一列的唯一值。这是我的做法:
import pandas as pd
df = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
a = df['A'].unique()
print a.sort()
问题在于我得到的输出是 None
。
sorted(iterable)
:返回一个由 iterable 中的项排序后组成的新列表。
CODE
import pandas as pd
df = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
a = df['A'].unique()
print(sorted(a))
输出
[1, 2, 3, 6, 8]
sort
方法会原地排序并不返回任何内容:
In [54]:
df = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
a = df['A'].unique()
a.sort()
a
Out[54]:
array([1, 2, 3, 6, 8], dtype=int64)
在调用sort
之后,您需要再次调用print a
。
例如:
In [55]:
df = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
a = df['A'].unique()
a.sort()
print(a)
[1 2 3 6 8]
unique()
返回一个numpy.ndarray,所以sort()
实际上是numpy.ndarray.sort()
方法。这就是为什么行为出乎意料。drop_duplicates()
返回一个pandas系列或数据框,允许使用sort_values()
。 - wisbuckydf = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
a = df['A'].drop_duplicates()
a.sort()
print a
drop_duplicates()
比unique()
快3倍。 - fixxxerdf['A'].drop_duplicates().sort_values()
是我最喜欢的代码。 - GitHunter0df['A'].drop_duplicates().sort_values()
drop_duplicates()
比unique()
更好,因为它可以处理多列(数据框),而不仅仅是单列(序列)。 - wisbuckysorted(df.A.unique())
。它比df.A.sort_values().unique()
好,但肯定不是最快的代码。 - undefineda.sort()
调用排序函数来改变列表 a 的值。在我的理解中,这是一条修改命令。要查看结果,您需要使用print(a)。
我的解决方案是尝试让所有东西都保留在Pandas中:
pd.Series(df['A'].unique()).sort_values()
pandas
的解决方案,因为它将 NaN
值放置在末尾,并且可以处理混合类型的数组。 - m13op22我更喜欢一行代码:
print(sorted(df['Column Name'].unique()))
import numpy as np
np.sort(df.A.unique())
但是在pandas中完成所有操作也是有效的。
另一种方法是使用set数据类型。
Sets的一些特点:无序,可以包含不同的数据类型,集合中的元素不能重复,可变。
解决您的问题:
df = pd.DataFrame({'A':[1,1,3,2,6,2,8]})
sorted(set(df.A))
List类型的答案:
[1, 2, 3, 6, 8]
很惊讶没有人提出这个建议:
df['A'].sort_values().unique()
a.sort()
会修改a
的值并且不返回任何结果,因此可以替换为:a.sort(); print a
。 - stellasiaunique()
返回一个numpy.ndarray,因此sort()
实际上是numpy.ndarray.sort()
方法。这就是为什么行为出乎意料的原因。drop_duplicates()
返回一个pandas系列或数据帧,允许使用sort_values()
。 - wisbucky