一、安装pandas

  1. pip install pandas

 

二、数据结构

pandas有两种数据结构,这里篇幅主要讲述DataFrame。

DataFrame相当于一种二维的数据模型,相当于excel表格中的数据,有横竖两种坐标,横轴很Series 一样使用index,竖轴用columns 来确定,在建立DataFrame 对象的时候,需要确定三个元素:数据,横轴,竖轴。

 

三、DataFrame基本使用

本次案例使用的测试表单:https://pan.baidu.com/s/1xn6gdMlh0pWHa-pnVv2LqA

1 创建DataFrame数据

  创建不是我们本次的重点,我们所直接使用下列读取现有表的方法

2 读取excel/csv,读取到的数据在DataFrame具柄中进行处理

  1. # 读取test.xls,并指定sheet
  2. df = pd.DataFrame(pd.read_excel(\'test.xls\',sheet_name=\'detail\'))

3 抽取指定列名赋值给need_df

  1. # 指定列名,将这一列赋值到package_num_df 这个具柄,并打印结果
  2. need_df = df[[\'工厂\',\'仓库\',\'捆包号\',\'树种\',\'规格\',\'账面数量\',\'账面米数\']]
  3. print(need_df)

4 在need_df的dataframe中筛选[捆包号]=J-0001-04,并打印结果

  1. find_need_df = need_df.loc[need_df[\'捆包号\'] == \'J-0001-04\']
  2. print(find_need_df)

5在df的dataframe中删除label标签=1 的数据并打印结果(dataframe只存在于内存中,并不会改变原来的excle表数据,可以通过将内容中的dataframe重新赋值给新表即可

  1. #删除行号=1的那一整行,axis默认=0,inplace默认=False(不删除原来excel的数据) 标志为True的话就说明将存储在内存中的df 行号为1进行删除
  2. res = df.drop(labels=1, axis=0, inplace=True)
  3. print(df)

find_need_df = need_df.loc[need_df[\’捆包号\’] == \’原来df数据

drop后df的数据

 

6写入excel/csv

  1. #安装本地目录,格式化制定文件名称
  2. wb_path = os.path.join(dir_path,\'work_book\')
  3. ctime = datetime.datetime.now().strftime(\'%Y%m%d_%H%M\')
  4. df.to_excel(\'%s/%s_detail.xls\'%(wb_path,ctime))

若遇到 # ModuleNotFoundError: No module named \’xlwt\’ ,则需要安装xlwt模块

  1. find_need_df.to_csv(\'temp.csv\', mode=\'a\', encoding=\'gbk\')

 

 

四、DataFrame增删改查操作

1 创建练习案例dataframe

  1. import pandas as pd
  2. import numpy as np
  3. data = {\'city\': [\'Beijing\', \'Shanghai\', \'Guangzhou\', \'Shenzhen\', \'Hangzhou\', \'Chongqing\'],
  4. \'year\': [2016,2017,2016,2017,2016, 2016],
  5. \'population\': [2100, 2300, 1000, 700, 500, 500]}
  6. frame = pd.DataFrame(data, columns = [\'year\', \'city\', \'population\', \'debt\'])
  7. df1 = pd.DataFrame({\'apts\': [55000, 60000],
  8. \'cars\': [200000, 300000], },
  9. index=[\'Shanghai\', \'Beijing\'])
  10. df2 = pd.DataFrame({\'apts\': [25000, 20000],
  11. \'cars\': [150000, 120000], },
  12. index=[\'Hangzhou\', \'Najing\'])
  13. df3 = pd.DataFrame({\'apts\': [30000, 10000],
  14. \'cars\': [180000, 100000], },
  15. index=[\'Guangzhou\', \'Chongqing\'])
  16. df4 = pd.DataFrame({\'apts\': [55000, 60000, 58000],
  17. \'cars\': [200000, 300000, 250000],
  18. \'cities\': [\'Shanghai\', \'Beijing\', \'Shenzhen\']})
  19. df5 = pd.DataFrame({\'salaries\': [10000, 30000, 30000, 20000, 15000],
  20. \'cities\': [\'Suzhou\', \'Beijing\', \'Shanghai\', \'Guangzhou\', \'Tianjin\']})
  21. # print(df1)
  22. # print(df2)
  23. # print(df3)
  24. # print(df4)
  25. # print(df5)

创建练习案例代码

 

2 增

  1. # frame.ix[0] = np.arange(4) # 在第0行添加新行,分别为0,1,2,3
  2. # frame.insert(0, \'temp\', frame.year) # 在第0列处添加新列,名为temp
  3. # frame.ix[:, \'xx\'] = np.arange(6) # 在末尾添加列名=xx的新列
  4.  
  5. # df1.append(df2) # 往df1末尾添加df2形成一个新数据
  6. # pd.concat([df1, df2, df3]) # 往末尾添加多个dataframe,复用原来的column
  7. # pd.concat([df1, df2, df3], axis=1,sort=False) #axis=1时,不复用其他df的colums,各自使用自己的colums横向阶梯式合并
  8.  
  9. # 按照关键字做并集
  10. # result = pd.merge(df4, df5, on=\'cities\') #按照关键字cities的值相等时,将数据做并集
  11. # result2 = pd.merge(df4, df5, on=\'cities\', how=\'outer\') # 按colums作并集,然后其他数据依次并集填入,不存在的值置为NaN

view code

 

3 删

  1. # del frame[\'year\'] # 删除year列
  2. # frame = frame.drop([\'city\', \'debt\'], axis=1) # 删除多列,axis=1 表示x轴方向
  3. # frame = frame.drop([0, 1, 2]) # 删除dataframe索引= 0、1、2行
  4. #
  5. # frame.dropna() # 删除带有Nan的行
  6. # frame.dropna(axis=1, how=\'all\') # 删除全为Nan的列
  7. # frame.dropna(axis=1, how=\'any\') # 删除带有Nan的列
  8. # frame.dropna(axis=0, how=\'all\') # 删除全为Nan的行
  9. # frame.dropna(axis=0, how=\'any\') # 删除带有Nan的行 默认选项为此

View Code

 

4 改

  1. # 元素赋值
  2. # frame.loc[0, \'city\'] = \'YunCheng\' # 将frame数据中 dataframe索引=0,colums=city 的值改为 YunCheng
  3. # frame.iloc[0, 0] = 2011 #将frame数据中,dataframe y轴索引=0,x轴索引=0的值改为2011(索引为主)
  4. # frame.at[0, \'city\'] = \'YunCheng\'
  5. # frame.iat[0, 0] = 2010 #将frame数据中,dataframe y轴索引=0,x轴索引=0的值改为 2010
  6. # frame.fillna(value=1) # 用1替换NaN
  7.  
  8. # 列赋值
  9. # frame[\'year\'] = 2000 #将year这一列的数值全部更改为2000
  10. # frame.debt = np.arange(6) #将debt这一列的值按0-5 依次填入
  11.  
  12. # val = pd.Series([200, 300, 500]) #制作series二维数列,
  13. # frame[\'debt\'] = val #将val依次填入debt这一列,剩余没有被填充到的默认NaN
  14.  
  15.  
  16. # 行赋值
  17. # val = pd.Series([\'aa\', 2000, 500], index=[\'city\', \'year\', \'population\']) #制作二维数列
  18. # frame.loc[0] = val #将val按照列 year city population的值分别新增到x轴首行,并将索引位置0,debt则置NaN

View Code

 

5 查

  1. # frame.index # 查询frame数据的所以y轴索引起止、步长
  2. # frame.columns # 查询frame数据的colums具体有哪些列
  3. # frame.values # 查询frame数据的值,按y轴索引,从0开始,每一行作为一个列表,共6行组成一个新的大列表
  4.  
  5.  
  6. # 元素查找
  7. # xx = frame.loc[0, \'city\'] # 数据是什么类型,xx就是什么类型
  8. # xx = frame.loc[[0], [\'city\']] # DataFrame类型
  9.  
  10. # 行查找
  11. # df = frame.loc[0:2] # DataFrame数据 y轴索引切片0~2 顾首顾尾。
  12. # df = frame.iloc[0:2] # DataFrame类型 y轴索引切片0~2 顾首不顾尾。
  13. # df = frame[0:3] # DataFrame数据,y轴索引切片0~3 顾首不顾尾
  14. # df = frame.ix[0] # Series类型 y轴索引为0,的那一行数据
  15.  
  16.  
  17. # 列查找
  18. # df = frame.loc[:, \'city\'] # 切片查找,列为city的那一列
  19. # df = frame.loc[:, [\'city\', \'population\']] # 切片查找,列为city、population的那两列形成新的dataframe
  20. # df = frame.iloc[:, 0:2] # DataFrames数据x轴切片, 索引为0~2 顾首不顾尾形成新的dataframe
  21. # df = frame[\'year\'] # 将year那一列的所有值取出
  22. # df = frame.year # Series类型 同上
  23. # df = frame[[\'population\', \'year\']] # DataFrame类型 筛选population year两列重新组合dataframe
  24. # df = frame.filter(regex=\'population|year\') # 结果同上
  25. # frame[frame.year > 2016] # 选择frame.year中>2016的行
  26. # res =frame[frame.year.isin([\'2016\', \'2015\'])] # DataFrame数据,筛选year= 2016 或者2015的数据
  27. # res = frame[[\'city\', \'year\']][0:3] # DataFrame 筛选出city和year两列,并按y轴 0~3 顾首不顾尾进行切片,重组成新的dataframe
  28.  
  29.  
  30. # 块查找
  31. # df = frame.iloc[0:2, 0:2] # DataFrame数据,按x轴 y轴分别进行索引0~2 顾首不顾尾的切片,并重组新的dataframe
  32.  
  33.  
  34. # 条件查找
  35. # df = frame.year.notnull() # Series类型 判断year列的值是否不为空
  36. # df = frame[\'year\'].notnull() # Series 同上
  37. # df = frame[frame.year.notnull()] # DataFrame类型 按照year非空筛选之后的结果
  38. # df = frame[frame.year.notnull()].values # ndarray类型,按照year非空筛选之后的结果,形成一个大列表
  39. # df = frame[frame.year == 2016][frame.city == \'Beijing\'] # DataFrame
  40. # df = frame.debt[frame.year == 2016][frame.city == \'Beijing\'] # 使用多条件year=2016、city=Beijing查询debt的值

View Code

 

 

五、数据透视表

话不多说,直接上例子说明下简单的一个用法:

本次案例使用的测试表单:https://pan.baidu.com/s/1HZCN9wZ_6sSNSnbUZPViHQ

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.read_excel(\'./work_book/pandas_sheet.xlsx\')
  4. pd.set_option(\'display.width\', None) #解决pandas模块会出现省略号的问题
  5. # print(df.head()) #读取前五行数据
  6. df[\'Status\'] = df[\'Status\'].astype(\'category\')
  7. df[\'Status\'].cat.set_categories([\'won\',\'pending\',\'presented\',\'declined\'], inplace=True)
  8. ### 例1: 均值运算数据透视
  9.  
  10. # 单索引为[Name]字段,account price quantity进行平均值运算
  11. res_ave_1 = pd.pivot_table(df, index=[\'Name\'])
  12. # print(res_ave_1)
  13.  
  14. # 多索引为[Name],[Rep],[Manager]字段,account price quantity进行平均值运算
  15. res_ave_2 = pd.pivot_table(df,index=[\'Name\', \'Rep\', \'Manager\'])
  16. # print(res_ave_2)
  17.  
  18. # 多索引为[Manager][Rep]字段,account price quantity进行平均值运算
  19. res_ave_3 = pd.pivot_table(df, index=[\'Manager\',\'Rep\'])
  20. # print(res_ave_3)
  21.  
  22. # 多索引为[Manager][Rep]字段,value为[Price]进行平均值运算
  23. res_ave_4 = pd.pivot_table(df, index=[\'Manager\',\'Rep\'], values=[\'Price\'])
  24. # print(res_ave_4)
  25.  
  26. # 多索引为[Manager][Rep]字段,value为[Price]并使用numpy的mean方法,并计算对应数据量的长度
  27. res_ave_5 = pd.pivot_table(df, index=[\'Manager\',\'Rep\'], values=[\'Price\'], aggfunc=[np.mean, len])
  28. # print(res_ave_5)
  29.  
  30.  
  31.  
  32. ### 例2: 求和运算数据透视
  33.  
  34. # 表格从左往右,以[Manager]为第一索引,[Rep]为第二索引,表格最上面以[Price]为第一索引,二级索引以[Product]的明细分别展开,
  35. # 统计数据以数据求和,product 没有的部分填充NaN(fill_value=0是将NaN填充为0),margins=True表示所有表进行所有项目合计求和
  36. res_sum_1 = pd.pivot_table(df, index=[\'Manager\',\'Rep\'], values=[\'Price\'], columns=[\'Product\'], aggfunc=[np.sum], fill_value=0, margins=True)
  37. # print(res_sum_1)
  38.  
  39.  
  40. #表格从左往右,以[Manager]为第一索引,[status]为第二索引,表格上面以\'均值\'、\'合计\'、\'单元格长度个数\'三大项作为大列,大列中分别都以
  41. # CPU Maintenance Monitor Software 作为明细项列分开进行单独计算(NaN项以0填充)
  42. res_sum_2 = pd.pivot_table(df, index=[\'Manager\', \'Status\'], columns=[\'Product\'], values=[\'Quantity\', \'Price\'],
  43. aggfunc={\'Quantity\':len, \'Price\':[np.sum,np.mean]}, fill_value=0 )
  44. # print(res_sum_2)
  45.  
  46.  
  47.  
  48. ### 例3:数据透视表过滤
  49.  
  50. #上述透视表res_sum_2生成后,他就位于DataFrame中,所以可以进行标准的DataFrame函数对其进行过滤,以Manager为筛选字段,字段值=Debra Henley
  51. res_filter_1 = res_sum_2.query(\'Manager == ["Debra Henley"]\')
  52. # print(res_filter_1)

均值运算透视+求和运算透视+透视过滤筛选

 

版权声明:本文为lich1x原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lich1x/p/11319364.html