鱼C论坛

 找回密码
 立即注册
查看: 835|回复: 9

[已解决]像求助一道让python从excel里提取并且处理文件的问题

[复制链接]
发表于 2020-3-27 21:13:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我有一个excel文件会显示年月日,降雨量,平均温度和最高,最低温度
DAY        MONTH        YEAR        PRCP        TAVG        TMAX        TMIN
12        3                2018                0        27.9                                25.6
13        3                2018               0        28.2               
14        3               2018              0        28.6                                25.2
excel里的有些数值是不存在的,所以要显示他是null
我要如何写一个程序让我在输入summary(filename, year, c_name)时会显示(num_data, max_data, min_data, sum_data)(一共有几组数据,最高数据,最低数据和数据总和)

>>> summary('Weather.csv', 2018, 'PRCP')
(287, 60.7, 0.0, 1277.0)
>>> summary('Weather.csv', 2019, 'TMIN')
(220, 28.0, 21.9, 5639.0)
>>> summary('Weather.csv', 2019, 'TMAX')
(0, None, None, 0)
>>> summary('Weather.csv', 2020, 'TAVG')
(70, 29.1, 25.6, 1954.7)

excel的文档位置老师已经写好不用改。
最佳答案
2020-3-27 23:09:08
大体是这样,你自己在稍微改改就ok了
import pandas as pd
df = pd.read_excel("C:\\Users\\Chysial\\Desktop\\Weather.xlsx")
#缺失值处理,因为你要求是null在缺失值时候就是None了
def summary(filename="C:\\Users\\Chysial\\Desktop\\Weather.xlsx",year = "2018",c_name="tmin"):
    df = pd.read_excel("C:\\Users\\Chysial\\Desktop\\Weather.xlsx")
    #其实就是一个函数.loc
    dt = df.loc[df['year'].isin([year])]
    num_data = dt.shape[0]
    max_data = dt[c_name].max()
    min_data = dt[c_name].min()
    if dt[c_name].sum() ==0:
        sum_data = 'None'
    else:
        sum_data = dt[c_name].sum()
    return [num_data,max_data,min_data,sum_data]
print(summary())
if __name__=="__main__":
    summary()
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-27 23:09:08 | 显示全部楼层    本楼为最佳答案   
大体是这样,你自己在稍微改改就ok了
import pandas as pd
df = pd.read_excel("C:\\Users\\Chysial\\Desktop\\Weather.xlsx")
#缺失值处理,因为你要求是null在缺失值时候就是None了
def summary(filename="C:\\Users\\Chysial\\Desktop\\Weather.xlsx",year = "2018",c_name="tmin"):
    df = pd.read_excel("C:\\Users\\Chysial\\Desktop\\Weather.xlsx")
    #其实就是一个函数.loc
    dt = df.loc[df['year'].isin([year])]
    num_data = dt.shape[0]
    max_data = dt[c_name].max()
    min_data = dt[c_name].min()
    if dt[c_name].sum() ==0:
        sum_data = 'None'
    else:
        sum_data = dt[c_name].sum()
    return [num_data,max_data,min_data,sum_data]
print(summary())
if __name__=="__main__":
    summary()
    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 21:07:56 | 显示全部楼层
Chysial 发表于 2020-3-27 23:09
大体是这样,你自己在稍微改改就ok了

请问老师说不能用pandas要用Implement Map和Filter该怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 21:18:29 | 显示全部楼层
本帖最后由 Chysial 于 2020-3-28 21:25 编辑
hnldyxx551 发表于 2020-3-28 21:07
请问老师说不能用pandas要用Implement Map和Filter该怎么办


那要怎么打开excel啊,不用openpyxl,numpy,pandas?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 21:41:36 | 显示全部楼层
Chysial 发表于 2020-3-28 21:18
那要怎么打开excel啊,不用openpyxl,numpy,pandas?

因为我上传作业的网站已经默认打开了csv了。所以我只需要处理数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-28 21:44:23 | 显示全部楼层
Chysial 发表于 2020-3-28 21:18
那要怎么打开excel啊,不用openpyxl,numpy,pandas?

不好意思麻烦到你了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 22:00:15 | 显示全部楼层
hnldyxx551 发表于 2020-3-28 21:41
因为我上传作业的网站已经默认打开了csv了。所以我只需要处理数据

说实话我真没有用过csv可以吧把csv转化成DataFrame,也是用pandas哈哈 ;
csv_file = "yourfilename.csv"
csv_data = pd.read_csv(csv_file, low_memory = False)#防止弹出警告
csv_df = pd.DataFrame(csv_data)
后面就一样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 23:05:10 | 显示全部楼层
我没有cav文件,你可以把它输出成一个列表,按照我这个方法来
from lxml import etree
import openpyxl

def len_column(dt):
    for i in range(1,1000):
        if dt.cell(row = 1, column = i).value == None:
            return i
def len_row(dt):
    for i in range(1,10000):
        if dt.cell(row = i, column =1).value == None:
            return i
def summary(filename = 'C:\\Users\\Chysial\\Desktop\\Weather.xlsx',year='2018',c_name='tmin'):
    df = openpyxl.load_workbook(filename)
    dt = df['Sheet1']
    title = []
    for i in range(1,len_column(dt)):
        title.append(dt.cell(1,i).value)
    j =0
    list_c_name = []
    for i in range(len(title)):
        if title[i] == c_name:
            c_name_num = i
    for i in range(2, len_row(dt)):
        if dt.cell(row = i,column = 3).value == int(year):
            j += 1
        list_c_name.append(dt.cell(row = i,column = c_name_num + 1).value)
    list_c_name.remove(None)
    if list_c_name:
        max_num = max(list_c_name)
        min_num = min(list_c_name)
        sum_num = sum(list_c_name)
    else:
        max_num = 'None'
        min_num = 'None'
        sum_num = 'None'
        
    return  j,max_num,min_num,sum_num


print(summary())


#我没有cav文件,我可以用openpyxl写个大概意思,你把cav用read变成一个大的列表,列表的值对应openpyxl的value就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 15:56:33 | 显示全部楼层
Chysial 发表于 2020-3-28 23:05
我没有cav文件,你可以把它输出成一个列表,按照我这个方法来

我发现还是不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-29 16:03:27 | 显示全部楼层
我的是这样子的
def summary(filename, year, c_name)
    weather_data=read_csv(file name)
    summary_data=()
    row_data=[]
   
    num_data=int(year)
    max_data=max(float(c_name))
    min_data=min(float(c_name))
    sum_data=sum(float(c_name))
   
    if num_data==0
        max_data==none
        min_data==nine
        sum_data==0
        
        return row_data.append([num_data,max_data,min_data,sum_data])
    else:
        return row_data.append([num_data,max_data,min_data,sum_data])
   
    summary_data.qppend(row.data)
    return round(summary_data,dp)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表