【问题标题】:Python Dataframe - how to sort values by numeric & alphabet (ascending) and string length (descending)Python Dataframe - 如何按数字和字母(升序)和字符串长度(降序)对值进行排序
【发布时间】:2021-06-09 04:15:42
【问题描述】:

我想通过以下逻辑对数据框中的 1 列进行排序:

  1. 数字在前 - 按升序排列;
  2. 字母按照升序排列;
  3. 最后,字符串长度 - 按降序排列。

示例数据框 - 使用 name 列进行排序并最终添加一个“订单”列:

import pandas as pd
df_1 = pd.DataFrame({'name': ['3D', '3DD', 'AC', 'AC-', 'BE', '2C','BED'], 'score': [2, 4, 2, 3, 10, 8, 2]})

我已经尝试了下面的 sort_values(),

df_1['Len'] = df_1['name'].apply(lambda x: len(x))
df_1.sort_values(by=['name', 'Len'], ascending=[True, False], inplace=True,ignore_index=True)
df_1.drop(columns=['Len'], inplace=True)
df_1['Order'] = df_1.index+1

但是,给我这个结果 - 基本上按降序排序的字符串长度不起作用:

   name score   Order
0   2C  8   1
1   3D  2   2
2   3DD 4   3
3   AC  2   4
4   AC- 3   5
5   BE  10  6
6   BED 2   7

根据我上面的排序逻辑,这是想要的结果:

  name  score   Order
0   2C  8   1
1   3DD 4   2
2   3D  2   3
3   AC- 3   4
4   AC  2   5
5   BED 2   6
6   BE  10  7

谢谢!

【问题讨论】:

  • 您可以编写一个评分函数来计算来自name 列的订单并将其提供给sort_valueskey

标签: python pandas dataframe sorting


【解决方案1】:

您可以使用 ASCII 表的最后一个元素将名称填充为相同的长度,以便 pandas 知道如何自动排序。

          name
0           2C
1           3D
2          3DD
3           AC
4          AC-
5           BE
6          BED

max_length = max(df.name.str.len())

df.loc['sort_name']=df.name.str.pad(max_length,'right','~')

df.sort_values('sort_name', inplace=True, ignore_index=True)
  name sort_name
0   2C       2C~
2  3DD       3DD
1   3D       3D~
4  AC-       AC-
3   AC       AC~
6  BED       BED
5   BE       BE~

这会将列的最大长度作为要填充的数字。

对数据框进行排序后,您可以删除列

df = df.drop('sort_name', axis=1)

【讨论】:

  • 这太棒了!
  • 嗨@sergiomahi:谢谢你。但是,最大长度并不总是只有 3,有时会超过 3,具体取决于用户提供的值,因此我们不会知道最大长度。
  • @XavierSun 看到我的编辑。添加该行代码将自动计算列的最大长度并使用它,因此您不必事先知道。
  • 嗨@sergiomahi,非常感谢!我将 max_length 修改为 intmax_length = int(max(df['name'].str.len())) 以使其工作。它适用于我的示例数据,但不适用于我的真实数据,可能是因为同一数据框中的其他列影响了按字符串长度排序?想知道是否还有其他方法可以实现这一目标?
  • @sergiomahi,实际上当我修改为df.sort_values('sort_name', inplace=True, ignore_index=True) 时,它正在工作。也许编辑您的答案也会很棒,以便其他用户在有相同需求时可以使用相同的方法来申请。修改后我可以将其标记为Answer。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2012-12-24
  • 2022-01-09
  • 2021-12-19
  • 2013-06-05
相关资源
最近更新 更多