按字符串长度对数据框进行排序

53

我希望按名称长度排序。似乎没有sort_valueskey参数,所以我不确定如何实现这一点。下面是一个测试数据框:

import pandas as pd
df = pd.DataFrame({'name': ['Steve', 'Al', 'Markus', 'Greg'], 'score': [2, 4, 2, 3]})

可能是按列中字符串长度排序数据框架的重复问题。 - cs95
@jezrael,请阅读我的原因。我明确提到了它:https://stackoverflow.com/questions/46177362/sort-dataframe-by-length-of-string-in-a-column#comment79318016_46177362 - cs95
那里有更多的选项。如果没有,您可以编辑此答案并包括所有其他解决方案。 - cs95
6个回答

51
你可以使用由 len 创建的 Seriesindex 上的 reindex,并与 sort_values 一起使用:
print (df.name.str.len())
0    5
1    2
2    6
3    4
Name: name, dtype: int64

print (df.name.str.len().sort_values())
1    2
3    4
0    5
2    6
Name: name, dtype: int64

s = df.name.str.len().sort_values().index
print (s)
Int64Index([1, 3, 0, 2], dtype='int64')

print (df.reindex(s))
     name  score
1      Al      4
3    Greg      3
0   Steve      2
2  Markus      2

df1 = df.reindex(s)
df1 = df1.reset_index(drop=True)
print (df1)
     name  score
0      Al      4
1    Greg      3
2   Steve      2
3  Markus      2

很棒的答案,我也尝试过使用列表的方法(对DataFrame按列表长度排序),因为正如在这个链接中提到的那样,.str.len()可以用于列表。 - otayeby

46

使用 DataFrame.sort_values 函数,我们可以将一个匿名函数(lambda)应用于字符串长度的计算(使用 .str.len() Series 方法),并传递到 key 参数中:

df = pd.DataFrame({
    'name': ['Steve', 'Al', 'Markus', 'Greg'], 
    'score': [2, 4, 2, 3]
})
print(df)

     name  score
0   Steve      2
1      Al      4
2  Markus      2
3    Greg      3
df.sort_values(by="name", key=lambda x: x.str.len())

     name  score
1      Al      4
3    Greg      3
0   Steve      2
2  Markus      2

谢谢。以防有人需要小写并排序 df.sort_index(key=lambda x: x.str.lower().str.len()) - Shovra

16
我发现这个解决方案更加直观,特别是如果您以后想要根据列长度执行某些操作。

我发现这种解决方案更加直观,特别是如果您以后想要根据列长度执行某些操作。

df['length'] = df['name'].str.len()
df.sort_values('length', ascending=False, inplace=True)

现在你的数据框将会有一个名为 length 的列,其中包含来自列 name 的字符串长度值,并且整个数据框将按照降序排序。


1
这应该是被接受的答案。更简单,易于重用。 - Display name

3
一个时尚而简洁的解决方案:
df.iloc[df.agg({"name":len}).sort_values('name').index]



     name  score
1      Al      4
3    Greg      3
0   Steve      2
2  Markus      2

1
太好了!谢谢!! - luckyCasualGuy

3

@jezrael的回答非常好,解释得很清楚。以下是最终结果:

index_sorted = df.name.str.len().sort_values(ascending=True).index
df_sorted = df.reindex(index_sorted)
df_sorted = df_sorted.reset_index(drop=True)

0
值得使用key参数来避免创建不必要的列:
df.sort_values("column_name", ascending=True, key=lambda col: col.str.len())

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