按多列排序pandas数据框并忽略大小写

4

我在一个使用pandas的Python脚本中有一个数据框需要按多个列排序,但是当前值的大小写会影响排序。例如,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列(不进行硬编码),那将非常棒。

如果您想确保所有情况都是小写,那么可以使用 .lower()。然而,如果您想完全忽略大小写,则需要稍微复杂一些。建议在这里查看: https://dev59.com/C3RC5IYBdhLWcg3wXP0C - Nick H
1个回答

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://dev59.com/C3RC5IYBdhLWcg3wXP0C#29247821
    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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接