如何按名称对具有匹配元素的值进行排序?
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.factorize
为Team
列创建有序键:
>>> 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)
【讨论】:
以上是关于如何按名称对具有匹配元素的值进行排序?的主要内容,如果未能解决你的问题,请参考以下文章
alpha 对具有相同整数值且应按升序排列的列表进行排序[重复]
如何按字段值(即“原因”字段名称及其值可能是“垃圾邮件”、“裸露”等)对 Firebase Firestore 数据进行排序