python数据分析与可视化--体育收入排行榜

目录

        题目

        思路:

        代码:

        补充:

        pandas版思路

        pandas版代码(简化)

        总结


题目

 

思路:

1.其实没有太大的技术含量,就是把数据整理后输出,折磨人的反而是调整输出的格式,数据量有点大,但是有行列标,比较方便整理。其实本题更适合用pandas,但是我还是用了numpy,因为大部分比赛允许用numpy而不允许用pandas

2.首先读取数据并转化为二维列表,再来看题目的需求

3.示例1给出的是错误输出,我们不妨放到最后的else里面解决

4.示例2输入了sport和年份得到一个年度的运动列表并按升序排列,在输入一个数获得前几名的信息和总收入。说白了就是要把得到的二维列表先取出特定的年份,再把年份当中的体育汇总并去重,最后进行排列。如果用pandas可以先groupby年份,最后直接排序,而numpy则较为复杂。排序完成后要输出信息,所以排序的时候不能把列单独拿出来作为一个列表排列,而应该用到按列排序或者lambda函数来排序,我采用的是把他拿出来排序的,对数据排序记得删掉字符串并转整形或者浮点型

5.无语了之前写的屎山自己看不下去了,改天写个pandas版本的,直接放代码吧。

代码:

import numpy as np

with open ('2012-19sport.csv', encoding='utf-8') as file:
    file.readline()
    data = file.read().strip().replace('\n', ',').split(',')

def sport_thing():
    year = input()
    set1 = set()
    sum = 0
    yearly_data = np.array(data).reshape(755, 7)# 全表
    for x, i in enumerate(yearly_data[:,6]):
        if i == year:
            set1.add(yearly_data[x, 5])
    else:
        list1 = sorted(list(set1))
        for num, sp in enumerate(list1):
            print(f'{num + 1}: {sp}')
        cho = int(input()) - 1
        sport_name = list1[cho]
    for x, i in enumerate(yearly_data[:,6]):
        if i == year and yearly_data[x, 5] == sport_name:
            sum = sum + float(yearly_data[x, 2].replace('$', '').replace(' M', ''))
            for item in yearly_data[x]:
                if item != year:
                    print(item.replace('#', ''),end = ' ')
                    print('|', end=' ')
                if item == year:
                    print(item)
    else:
        print(f'TOTAL: ${sum :.2f} M')

def print_thing():
    n = int(input())
    yearly_data = np.array(data).reshape(755, 7)# 全表
    number = 0
    for i in range(755):
        if yearly_data[i,6] == what:
            for num,j in enumerate(yearly_data[i]):
                if j != what:
                    print(j.replace('#', ''), end = ' ')
                    print('|', end = ' ')
                elif j == what and num != len(yearly_data):
                    print(j)
                    number = number + 1
        if number >= n:
            break

if __name__ == '__main__':
    what = input()
    if what.lower() == 'sport':
        sport_thing()
    elif 2012 <=int(what) <= 2019:
        print_thing()
    else:
        print('Wrong Input')
# 自己写的狗屎自己看不下去了

补充:

pandas版思路

1.读文件,并转为dataframe,把header设置为0以把第一行设置为索引

2.对数据进行分类(groupby),第一问按年分后取出sport内的值,并用sort_values来排序,随后输入运动类型后按相应类型groupby并排序输出

3.pandas的输出格式懒得改了,大同小异,pandas部分代码无法直接再python123上提交,需要像np一样修改输出格式后才可以输出

pandas版代码(简化)

import pandas as pd
data = pd.DataFrame(pd.read_csv('2012-19sport.csv', header=0))
what = input()
if what.lower() == 'sport':
    year = int(input())
    year_data = sorted(pd.DataFrame(data.loc[data['Year'] == year]['Sport'].unique()).values.tolist())
    for x, i in enumerate(year_data):
        print(f"{x+1}: {''.join(map(str, i))}")
    sport = year_data[int(input())-1]
    data = data.loc[data['Year'] == 2019].loc[data['Sport'] == ''.join(sport)]
    for x, i in enumerate(data.values):
        print(''.join(map(str, i)))
elif 2012 <= int(what) <= 2019:
    num = int(input())
    year_data = (pd.DataFrame(data.loc[data['Year'] == int(what)]).values)
    for x, i in enumerate(year_data):
        if x < num :
            print(''.join(map(str, i)))
else:print('Wrong Input')

总结

今天有点划水,可能是到了周末有点懈怠了

pandas比numpy好用很多 但是一般比赛都会被ban 建议平常要练手用np 要生产力用pandas

以上

坚持 共勉

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值