如何按名称对具有匹配元素的值进行排序?

Posted

技术标签:

【中文标题】如何按名称对具有匹配元素的值进行排序?【英文标题】:How do I sort values by name that have a matching element? 【发布时间】:2022-01-10 18:11:25 【问题描述】:

在这个 DataFrame 中,球队需要保持在同一个位置,但我想对每个球队中的球员进行排序。

                 Team                Player  Apps
0    Newcastle_United             Joelinton   5.0
1    Newcastle_United   Allan Saint-Maximin   5.0
2    Newcastle_United         Callum Wilson   5.0
3    Newcastle_United      Jamaal Lascelles   5.0
4    Newcastle_United         Jeff Hendrick   2.0
..                ...                   ...   ...
471           Arsenal            Pablo Marí   2.0
472           Arsenal  Albert Sambi Lokonga   5.0
473           Arsenal       Folarin Balogun   2.0
474           Arsenal          Nuno Tavares   5.0
475           Arsenal                 Total   NaN

在这种情况下,输出应如下所示:

                 Team                 Player  Apps
0    Newcastle_United    Allan Saint-Maximin  5.0
1    Newcastle_United          Callum Wilson  5.0
etc

不过,我无法按“团队”、“玩家”排序,因为那样会重新排列团队的顺序。

我觉得这应该有一个非常简单的解决方案,但我很难过。 提前谢谢!

【问题讨论】:

【参考方案1】:

更方便的方法是使用pd.factorizeTeam 列创建有序键:

>>> df.assign(teamgroup=pd.factorize(df['Team'])[0]) \
      .sort_values(['teamgroup', 'Player']).drop(columns='teamgroup')

                 Team                Player  Apps
1    Newcastle_United   Allan Saint-Maximin   5.0
2    Newcastle_United         Callum Wilson   5.0
3    Newcastle_United      Jamaal Lascelles   5.0
4    Newcastle_United         Jeff Hendrick   2.0
0    Newcastle_United             Joelinton   5.0
472           Arsenal  Albert Sambi Lokonga   5.0
473           Arsenal       Folarin Balogun   2.0
474           Arsenal          Nuno Tavares   5.0
471           Arsenal            Pablo Marí   2.0
475           Arsenal                 Total   NaN

pd.factorize的输出:

>>> pd.factorize(df['Team'])
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]),
 Index(['Newcastle_United', 'Arsenal'], dtype='object'))

旧答案

您可以使用sort=False 作为groupby 的参数并在组内排序。

>>> df.loc[df.groupby('Team', sort=False)['Player'] \
             .apply(lambda x: x.sort_values()) \
             .index.get_level_values(1)]

                 Team                Player  Apps
1    Newcastle_United   Allan Saint-Maximin   5.0
2    Newcastle_United         Callum Wilson   5.0
3    Newcastle_United      Jamaal Lascelles   5.0
4    Newcastle_United         Jeff Hendrick   2.0
0    Newcastle_United             Joelinton   5.0
472           Arsenal  Albert Sambi Lokonga   5.0
473           Arsenal       Folarin Balogun   2.0
474           Arsenal          Nuno Tavares   5.0
471           Arsenal            Pablo Marí   2.0
475           Arsenal                 Total   NaN

【讨论】:

【参考方案2】:

Pandas Table

中的多个 排序
df.sort_values(by=['Team', 'Player'])

示例脚本演示 按Pandas Table

中的多个 排序
import pandas as pd

df = pd.DataFrame(
    'col1': ['A', 'A', 'B', 'np.nan', 'D', 'C'],
    'col2': [2, 1, 9, 8, 7, 4],
    'col3': [0, 1, 9, 4, 2, 3],
    'col4': ['a', 'B', 'c', 'D', 'e', 'F']
)

print("Print Data Frame")
print(df)

print("Print Sort By Column 1")
a = df.sort_values(by=['col1'])
print(a)

print("Print Sort By Column 1, Column 2")
b = df.sort_values(by=['col1', 'col2'])
print(b)

【讨论】:

以上是关于如何按名称对具有匹配元素的值进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

在python中,如何按元素的频率对列表进行排序

如何通过删除名称开头的数字按字母顺序对数据进行排序[重复]

MongoDB,按两个数组之间匹配元素的数量对结果进行排序

alpha 对具有相同整数值且应按升序排列的列表进行排序[重复]

按层次结构和名称对具有层次结构的对象数组进行排序

如何按字段值(即“原因”字段名称及其值可能是“垃圾邮件”、“裸露”等)对 Firebase Firestore 数据进行排序