pandas 按字符串长度对 Dataframe 排序

eh57zj3b  于 2022-12-21  发布在  其他
关注(0)|答案(5)|浏览(298)

我想按名称长度排序。sort_values似乎没有key参数,所以我不确定如何实现这一点。下面是一个测试df:

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

lsmepo6l1#

您可以将len创建的indexreindexsort_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
7gyucuyw

7gyucuyw2#

使用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
lf3rwulv

lf3rwulv3#

我发现这个解决方案更直观,特别是当你想根据列长做一些事情的时候。

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

现在,您的 Dataframe 将有一个名为length的列,其中包含来自name列的字符串长度值,整个 Dataframe 将按降序排序。

5w9g7ksd

5w9g7ksd4#

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

mec1mxoz5#

一个奇特而简约的解决方案:

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


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

相关问题