我在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个列(没有硬编码),那将是非常棒的。
答案 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
如果并非所有列都是字符串,但有些列是数字的,则可能必须为非数字列包含额外的mask
或set