【问题标题】:Grouping, calculating, and sorting scoring data对评分数据进行分组、计算和排序
【发布时间】:2016-06-17 20:51:37
【问题描述】:

我有一个列表列表,每个列表都有“row id”、“team name”、“team number”、“scout”、“score”:

teams = [[23L, u'team1', 5713L, u'Gange', 144L], 
 [22L, u'team3', 1406L, u'Gange', 126L], 
 [15L, u'team2', 7319L, u'Bob Loblaw', 90L], 
 [17L, u'team2', 7319L, u'Gange', 54L], 
 [18L, u'team1', 5713L, u'Bob Loblaw', 69L], 
 [16L, u'team3', 1406L, u'Bob Loblaw', 113L]]

我想首先按“团队编号”值对数据进行分组,然后按团队获取“分数”值的最小/平均/最大值。通过使用这些函数,我可以使用 pandas 单独获取所有这些信息:

res = pd.DataFrame(teams)
res.columns = ['id', 'name', 'number', 'scout', 'score']
print res.groupby('number')['score'].min()
print res.groupby('number')['score'].mean()
print res.groupby('number')['score'].max()

number
406      0
5703     9
7129    18
Name: score, dtype: int64

number
406      9.0
5703    22.5
7129    27.0
Name: score, dtype: float64

number
406     18
5703    36
7129    36
Name: score, dtype: int64

我的问题是我想保留除分数之外的所有原始列,有效地将每个团队的行折叠成一行,并将分数列替换为具有最小值、平均值、最大值的行的列表/元组同一个团队,但要将其输出到 python 对象,我可以将其传递给一个表单,我不确定 pandas 是否是最好的模块。

我查看了一些带有 itertools、pandas、numpy 等的示例,但我现在正在兜圈子,不知道如何解决这个问题。提前感谢您的任何建议。

【问题讨论】:

  • 您能否提供所需输出的示例?从你的描述看不是很清楚。您说您希望每个团队都有一行(使用元组表示得分,这没问题),但看起来现有团队行在同一团队中可以具有不同的 scout 值(例如第一行和第五行)。你想怎么处理?
  • 好点,我应该提到侦察员对于汇总数据并不重要。很抱歉造成混乱。

标签: python python-2.7 pandas


【解决方案1】:

Python 随附电池。您可以使用sqlite3 模块中的SQLite 的强大功能。

import sqlite3

teams = [[23L, u'team1', 5713L, u'Gange', 144L],
 [22L, u'team3', 1406L, u'Gange', 126L],
 [15L, u'team2', 7319L, u'Bob Loblaw', 90L],
 [17L, u'team2', 7319L, u'Gange', 54L],
 [18L, u'team1', 5713L, u'Bob Loblaw', 69L],
 [16L, u'team3', 1406L, u'Bob Loblaw', 113L]]

con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table t (id int, team_name text, team_number int, scout text, team_score int)");
cur.executemany("insert into t values(?, ?, ?, ?, ?)", teams)
con.commit()

res = cur.execute("""
  SELECT team_number, min(team_score), max(team_score), avg(team_score)
    FROM t
GROUP BY team_number""")

print "team_number, min, max, avg"
for row in res:
    print row

输出:

team_number, min, max, avg
(1406, 113, 126, 119.5)
(5713, 69, 144, 106.5)
(7319, 54, 90, 72.0)

【讨论】:

  • 实际上现在我想起来了,我可能应该先在 sql 中执行所有这些逻辑,然后再将这些数据拉回应用程序。我会优化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2022-07-07
  • 2023-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多