根据一列中的字符串进行分组和排名

Posted

技术标签:

【中文标题】根据一列中的字符串进行分组和排名【英文标题】:groupby and ranking based on the string in one column 【发布时间】:2020-07-23 04:38:11 【问题描述】:

我正在处理一个数据框,其中包含 70 多个动作。我有一列将这 70 个动作分组。我想创建一个新列,它是现有列中字符串的等级。以下是数据框的示例:

DF = pd.DataFrame()
DF ['template']= ['Attk','Attk','Attk','Attk','Attk','Attk','Def','Def','Def','Def','Def','Def','Accuracy','Accuracy','Accuracy','Accuracy','Accuracy','Accuracy']
DF ['Stats'] = ['Goal','xG','xA','Goal','xG','xA','Block','interception','tackles','Block','interception','tackles','Acc.passes','Acc.actions','Acc.crosses','Acc.passes','Acc.actions','Acc.crosses']
DF=DF.sort_values(['template','Stats'])

我要创建的新列是 groupby [template] 并按字母顺序排列 Stats。

预期的数据框如下:

每个模板下都有 10 到 15 个统计信息。

【问题讨论】:

【参考方案1】:

GroupBy.transform 与lambda 函数和factorize 一起使用,也因为python 计数从0 添加1

f = lambda x: pd.factorize(x)[0]
DF['Order'] = DF.groupby('template')['Stats'].transform(f) + 1
print (DF)
    template         Stats  Order
13  Accuracy   Acc.actions      1
16  Accuracy   Acc.actions      1
14  Accuracy   Acc.crosses      2
17  Accuracy   Acc.crosses      2
12  Accuracy    Acc.passes      3
15  Accuracy    Acc.passes      3
0       Attk          Goal      1
3       Attk          Goal      1
2       Attk            xA      2
5       Attk            xA      2
1       Attk            xG      3
4       Attk            xG      3
6        Def         Block      1
9        Def         Block      1
7        Def  interception      2
10       Def  interception      2
8        Def       tackles      3
11       Def       tackles      3

【讨论】:

以上是关于根据一列中的字符串进行分组和排名的主要内容,如果未能解决你的问题,请参考以下文章

如何根据分组将字符串组合在一列中

如何使用模式列表在列中查找字符串并将匹配的模式添加到下一列的同一行

Pyspark根据另一列的模式替换列中的字符串

如何在 Hive SQL 中对一列中的数据进行分组并将其分布在另一列中?

根据 r 中的其他列对一个列表中的一列的所有值进行分组

Pandas:根据字符串的一部分是不是在另一列中的任何位置创建新列