HOWTO · Pandas
获取 Pandas 列中的唯一值并进行排序
本教程演示了如何在 Pandas DataFrame 中查找列中的唯一值以及如何对其进行排序。
本页内容
DataFrame 的列是 Pandas Series。调用其 unique() 函数,即可按首次出现的顺序获取不同值。若要保留对应行及其其他列,请使用 drop_duplicates();若要对值或行排序,可以使用 Python 的 sorted() 或 Pandas 的 sort_values()。
示例使用一个包含职业和部门的小型 DataFrame。运行以下示例。示例中的职业和部门名称以及显示的输出保留英文。
本节中的代码以及显示的标签或输出仍为英文。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
professions = df["profession"].unique()
print(professions)
print(type(professions).__name__)
<StringArray>
['designer', 'engineer', 'analyst']
Length: 3, dtype: str
StringArray
获取 DataFrame 列中的不同值
选择 df["profession"] 会返回一个 Series。它的 unique() 函数会按首次出现的顺序,为每种不同的职业返回一个值;它不会对这些值排序。具体结果类型取决于 Series 的 dtype。本例使用 Pandas 的 string 扩展 dtype,因此输出所示的结果是 StringArray。其他 dtype 可能会生成 NumPy 数组或其他扩展数组。请根据你的数据调整列名。如果只需要不同值的数量,可以使用 len(df["profession"].unique());而 len(df) 统计的是行数,其中也包括职业重复的行。如果后续操作需要普通 Python 列表,可以将结果转换为 .tolist()。
每种不同的列值保留一行
如果需要保留记录,而不只是得到一组值,可以对 DataFrame 调用 drop_duplicates(subset="profession")。结果仍是 DataFrame:每个保留的行都包含其部门,而且默认保留每种职业首次出现的那一行。在示例输出中,第二条设计师记录会被删除,第一条设计师记录及其产品部门则会保留。此操作不会根据其他规则选择代表性行;如果想保留符合其他条件的记录,请先排序或以其他方式选定行。默认情况下,结果保留原始索引标签,因此索引可能不连续。如果重复记录由多个列的组合定义,可以将多个列名组成列表传给 subset。
本节中的代码以及显示的标签或输出仍为英文。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
unique_rows = df.drop_duplicates(subset="profession")
print(unique_rows.to_string(index=False))
print(type(unique_rows).__name__)
profession department
designer product
engineer platform
analyst finance
DataFrame
对不同值或 DataFrame 行排序
Python 内置的 sorted() 会返回按升序排列的新列表。若要对不同值排序,可以将它与 unique() 组合使用;如果要保留重复值,也可以直接对 Series 排序。若要降序排列,请向 sorted() 传入 reverse=True。
如果希望排序后的行及其其他列仍保持对应,请使用 sort_values(by="profession")。它返回 DataFrame,默认按升序排序;若要降序,请设置 ascending=False。这两种方式会产生不同结果:对不同值排序会得到列表,对行排序则会保留行数据。可以向 by 传入列表,按优先级依次依据多个列排序。示例中的列表只包含职业值;最后的输出则保留所有行及其部门,并按职业从 engineer 排到 analyst。除非设置 ignore_index=True,否则 sort_values() 会保留原始索引标签;设置该参数后,排序结果会使用新的连续索引。输出中的列名和职业名称保留英文。
本节中的代码以及显示的标签或输出仍为英文。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
print(sorted(df["profession"].unique()))
print(sorted(df["profession"].unique(), reverse=True))
print(df.sort_values(by="profession", ascending=False).to_string(index=False))
['analyst', 'designer', 'engineer']
['engineer', 'designer', 'analyst']
profession department
engineer platform
designer product
designer research
analyst finance