通过忽略大小写的多列对pandas数据帧进行排序

时间:2017-06-07 09:34:47

标签: python pandas dataframe

我在Python脚本(使用pandas)中有一个数据框,需要按多列排序,但值的情况目前会混淆排序。例如,a和A的排序不同。首先,对大写字母进行排序,然后对小写字母进行排序。是否有任何简单的方法来排除它们忽略大小写。目前我有这样的事情:

df = df.sort(['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7'], ascending=[True, True, True, True, True, True, True])

重要的是,所有列都需要忽略大小写,并且值不能在最终排序的数据框中更改它们的大小写。

例如,第1列可以像这样排序(忽略大小写):

Aaa
aaB
aaC
Bbb
bBc
bbD
CCc
ccd

此外,如果功能可以使用x个列(没有硬编码),那将是非常棒的。

1 个答案:

答案 0 :(得分:2)

如果您只想按照较低的顺序进行排序,可以使用以下内容:

def sort_naive_lowercase(df, columns, ascending=True):
    df_temp = pd.DataFrame(index = df.index, columns=columns)

    for kol in columns:
        df_temp[kol] = df[kol].str.lower()
    new_index = df_temp.sort_values(columns, ascending=ascending).index
    return df.reindex(new_index)

如果你期望unicode问题,你可能会做这样的事情(借用@ nick-hale的评论):

def sort_by_caseless_columns(df, columns, ascending=True):
    # https://stackoverflow.com/a/29247821/1562285
    import unicodedata

    def normalize_caseless(text):
        return unicodedata.normalize("NFKD", text.casefold())
    df_temp = pd.DataFrame(index = df.index, columns=columns)

    for kol in columns:
        df_temp[kol] = df[kol].apply(normalize_caseless)
    new_index = df_temp.sort_values(columns, ascending=ascending).index
    return df.reindex(new_index)

如果您有更多可能的参数传递给sort_values,您可以使用**kwargs

如果并非所有列都是字符串,但有些列是数字的,则可能必须为非数字列包含额外的maskset