【问题标题】:Sorting Event Teams对活动团队进行排序
【发布时间】:2019-04-23 21:52:26
【问题描述】:

我正在尝试对机器人比赛的团队进行排名。他们将分三个阶段进行比赛。他们在每个阶段都有总分和持续时间。样本数据如下:

sample image of data

如果我不用比较时间,那么python的“max()”函数就可以了。

data["max"] = data[["stage1","stage2","stage3"]].max(axis=1)

我使用 pandas 库的“sort_values”方法对它们进行排序。为了对球队进行排名,我必须在 3 个阶段中找到最好的成绩。如果我不看时间,我可以通过在 max 方法中插入点来找到最好的分数,但如果点相等,我应该将它们与他们拥有的最佳时间进行比较。为了能够打出最好的成绩和获得足够的时间。

对于创建数据:

import pandas as pd
import numpy as np
import random

data = pd.DataFrame()

puanlar=[]
for sayi in np.ones(100):
    puanlar.append(sayi*random.randrange(1,100))
puanlar2 = []
for sayi in np.ones(100):
    puanlar2.append(sayi*random.randrange(1,100))
puanlar3 = []
for sayi in np.ones(100):
    puanlar3.append(sayi*random.randrange(1,100))
data["stage1"] = puanlar
data["stage2"] = puanlar2
data["stage3"] = puanlar3

dakika=[]
saniye = []
salise = []
for sayi in np.ones(100):
    dakika.append(random.randrange(1,4))
    saniye.append(random.randrange(1,60))
    salise.append(random.randrange(1,60))

data["stage1_minute"] = dakika
data["stage1_second"] = saniye
data["stage1_millisecond"] = salise
dakika=[]
saniye = []
salise = []
for sayi in np.ones(100):
    dakika.append(random.randrange(1,4))
    saniye.append(random.randrange(1,60))
    salise.append(random.randrange(1,60))

data["stage2_minute"] = dakika
data["stage2_second"] = saniye
data["stage2_millisecond"] = salise
dakika=[]
saniye = []
salise = []
for sayi in np.ones(100):
    dakika.append(random.randrange(1,4))
    saniye.append(random.randrange(1,60))
    salise.append(random.randrange(1,60))

data["stage3_minute"] = dakika
data["stage3_second"] = saniye
data["stage3_millisecond"] = salise
data["max"] = data[["stage1","stage2","stage3"]].max(axis=1)
data.sort_values(['max'], ascending=False,inplace=True)

【问题讨论】:

  • 请不要发布数据的示例图像。花点时间在帖子中输入部分内容,或提供数据生成代码。
  • 感谢您的建议,很抱歉变量名,但我已经添加了代码。
  • 你看过 sort_values 上的 Pandas 文档吗?另外,当时,我会在排序前将所有内容转换为毫秒。
  • 是的,我会找到我使用后收到的最大值和持续时间,但问题是:我不知道哪个阶段最高
  • 我编辑并试图描述性。感谢您的反馈:)

标签: python pandas


【解决方案1】:

我会创建相应列的某种组合并找到最大值:

np.random.seed(2019)
data_len = 1000
data = pd.DataFrame({'stage1': np.random.randint(1,10, data_len),
                     'stage2': np.random.randint(1,10, data_len),
                     'stage3': np.random.randint(1,10, data_len),
                     'stage1_min': np.random.uniform(1,4, data_len),
                     'stage1_sec': np.random.uniform(1,60, data_len),
                     'stage1_mil': np.random.uniform(1,60, data_len),
                     'stage2_min': np.random.uniform(1,4, data_len),
                     'stage2_sec': np.random.uniform(1,60, data_len),
                     'stage2_mil': np.random.uniform(1,60, data_len),
                     'stage3_min': np.random.uniform(1,4, data_len),
                     'stage3_sec': np.random.uniform(1,60, data_len),
                     'stage3_mil': np.random.uniform(1,60, data_len)})

# combination
for i in range(1,4):
    prefix = f'stage{i}'
    data[prefix+'new'] = [(stage, -m,-s, -ms) for stage, m, s, ms in zip(data[prefix],
                                                                       data[prefix+'_min'],
                                                                       data[prefix+'_sec'],
                                                                       data[prefix+'_mil'])]

data['max'] = data[[f'stage{i}new' for i in range(1,4)]].max(axis=1)

您也可以使用idxmax() 作为最大行的索引。

【讨论】:

  • 非常简洁的解决方案。我正在努力从中学习。如果您有时间,请您解释一下将列放在元组中如何影响 max 方法?
  • @SpaceMonkey55 真正的问题在于比较元组,即 (1,2) > (1,1)。由于 OP 将最佳时间视为分级中断,因此翻转时间符号是有效的,即 (1, -1) > (1, -2)。
猜你喜欢
  • 2021-12-31
  • 2017-09-27
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 2012-05-20
相关资源
最近更新 更多