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

时间:2017-02-28 18:54:36

标签: python pandas sorting series reindex

我想按名字长度排序。 key似乎没有sort_values参数,因此我不确定如何完成此操作。这是一个测试df:

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

5 个答案:

答案 0 :(得分:13)

您可以使用reindex创建的index Series len sort_values来填充{{3}}:

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

答案 1 :(得分:4)

DataFrame.sort_values key 参数一起使用 pandas >= 1.1.0

我们现在可以在sort_values方法中输入字符串或任何其他自定义键的长度:

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

答案 2 :(得分:3)

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

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

现在,您的数据框将包含一列,其中名称列的长度作为值,整个数据框将按降序排序。

答案 3 :(得分:2)

@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)

答案 4 :(得分:2)

一个花哨且最小的解决方案:

df.iloc[df.agg({"name":len}).sort_values('name').index]



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