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

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)

【讨论】:

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