我希望按名称长度排序。似乎没有sort_values
的key
参数,所以我不确定如何实现这一点。下面是一个测试数据框:
import pandas as pd
df = pd.DataFrame({'name': ['Steve', 'Al', 'Markus', 'Greg'], 'score': [2, 4, 2, 3]})
我希望按名称长度排序。似乎没有sort_values
的key
参数,所以我不确定如何实现这一点。下面是一个测试数据框:
import pandas as pd
df = pd.DataFrame({'name': ['Steve', 'Al', 'Markus', 'Greg'], 'score': [2, 4, 2, 3]})
len
创建的 Series
的 index
上的 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.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我发现这种解决方案更加直观,特别是如果您以后想要根据列长度执行某些操作。
df['length'] = df['name'].str.len()
df.sort_values('length', ascending=False, inplace=True)
现在你的数据框将会有一个名为 length
的列,其中包含来自列 name
的字符串长度值,并且整个数据框将按照降序排序。
df.iloc[df.agg({"name":len}).sort_values('name').index]
name score
1 Al 4
3 Greg 3
0 Steve 2
2 Markus 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)
key
参数来避免创建不必要的列:df.sort_values("column_name", ascending=True, key=lambda col: col.str.len())