pandas

1.pandas简介

  • 核心功能是在二维表格上做各种操作,如增删、修改、求一列数据的和、方差、中位数、平均数等
  • 需要numpy支持
  • 如果有openpyxl或xlrd或xlwt支持,还可以读写excel文档。
  • 最关键的类:DataFrame,表示二维表格

pip install pandas  安装pandas库

2.Series类

Series是一维表格,每个元素带标签且有下标,兼具列表和字典的访问形式。

import pandas as pd


s = pd.Series(data=[80, 90, 100], index=['语文', '数学', '英语'])
for x in s:
    print(x, end=" ")           # 80 90 100
print('')
print(s['语文'], s[1])            # 80 90
print(s[0:2]['数学'])             # 90
print(s['数学':'英语'][1])          # 100
for i in range(len(s.index)):
    print(s.index[i], end=" ")      # 语文 数学 英语
print('')
s['体育'] = 110                       # 在尾部添加元素,标签为体育,值为110
s.pop('数学')                     # 删除标签为数学的元素
s2 = s.append(pd.Series(120, index=['政治']))     # 不改变s
print(s2['语文'], s2['政治'])       # 80 120
print(list(s2))                     # [80, 100, 110, 120]
print(s.sum(), s.min(), s.mean(), s.median())   # 求和、最小值、平均值、中位数;  290 80 96.66666666666667 100.0
print(s.idxmax(), s.argmax())        # 元素索引最大值,和下标最大值; 体育 2

3.DataFrame类

DataFrame是带行列标签的二维表格,的每一列都是一个Series

import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
# 输出对齐方面的设置
scores = [['男', 108, 115, 97],
['女', 115, 87, 105],
['女', 100, 60, 130],
['男', 112, 80, 50]]
names = ['刘一哥', '王二姐', '张三妹', '李四弟']
courses = ['性别', '语文', '数学', '英语']
df = pd.DataFrame(data=scores, index=names, columns=courses)
print(df)
print(df.values[0][1], type(df.values)) # 108 <class 'numpy.ndarray'>
print(list(df.index)) # ['刘一哥', '王二姐', '张三妹', '李四弟']
print(list(df.columns)) # ['性别', '语文', '数学', '英语']
print(df.index[2], df.columns[2]) # 张三妹 数学
s1 = df['语文'] # s1是个Series,代表‘语文’那一列
print(s1['刘一哥'], s1[0]) # 108 108
print(df['语文']['刘一哥']) # 108
s2 = df.loc['王二姐'] # s2也是Series,代表‘王儿姐’那一行
print(s2['性别'], s2['语文'], s2[2]) # 女 115 87
# DataFrame的切片:
# iloc[行选择器, 列选择器] 用下标做切片
# loc[行选择器, 列选择器] 用标签做切片
# DataFrame的切片是视图
df2 = df.iloc[1:3] # 行切片,是视图,选第1、2行
df2 = df.loc['王二姐':'张三妹'] # 和上一行等价
print(df2)
# 性别 语文 数学 英语
# 王二姐 女 115 87 105
# 张三妹 女 100 60 130
df2 = df.iloc[:, 0:3] # 列切片(是视图),选0、1、2列
df2 = df.loc[:, '性别':'数学'] # 和上一行等价
print(df2)
# 性别 语文 数学
# 刘一哥 男 108 115
# 王二姐 女 115 87
# 张三妹 女 100 60
# 李四弟 男 112 80
df2 = df.iloc[:2, [1, 3]] # 行列切片
df2 = df.loc[:'王二姐', ['语文', '英语']]
print(df2)
# 语文 英语
# 刘一哥 108 97
# 王二姐 115 105
df2 = df.iloc[[1, 3], 2:4] # 取第1、3行,第2、3列
df2 = df.loc[['王二姐', '李四弟'], '数学':'英语'] # 与上一行等价
print(df2)
# 数学 英语
# 王二姐 87 105
# 李四弟 80 50
print('---下面是DataFrame的分析和统计---')
print(df.T) # df.T是df的转置矩阵,即行列互换的矩阵
print(df.sort_values('语文', ascending=False)) # 按语文成绩降序排列
print(df.sum()['语文'], df.mean()['数学'], df.median()['英语']) # 435 85.5 101.0
print(df.min()['语文'], df.max()['数学']) # 100 115
print(df.max(axis=1)['王二姐']) # 王二姐的最高分
print(df['语文'].idxmax()) # 王二姐 语文最高分所在行的标签
print(df['数学'].argmin()) # 2 数学最低分所在行的行号
print(df.loc[(df['语文'] > 100) & (df['数学'] >= 85)])
# 性别 语文 数学 英语
# 刘一哥 男 108 115 97
# 王二姐 女 115 87 105
print('---以下是DataFrame的增删和修改---')
df.loc['王二姐', '英语'] = df.iloc[0, 1] = 150 # 修改王二姐英语和刘一哥语文成绩
df['物理'] = [80, 70, 90, 100] # 为所有人添加物理成绩这一列
df.insert(1, '体育', [89, 77, 76, 45]) # 为所有人插入体育成绩到第1
df.loc['李四弟'] = ['男', 100, 100, 100, 100, 100] # 修改李四弟全部信息
df.loc[:, '语文'] = [20, 20, 20, 20] # 修改所有人的语文成绩
df.loc['钱五叔'] = ['男', 100, 100, 100, 100, 100] # 加入一行钱五叔
df.loc[:, '英语'] += 10 # 所有人英语加10分
df.columns = ['性别', '体育', '语文', '数学', 'English', '物理'] # 改列标签
print(df)
# 性别 体育 语文 数学 English 物理
# 刘一哥 男 89 20 115 107 80
# 王二姐 女 77 20 87 160 70
# 张三妹 女 76 20 60 140 90
# 李四弟 男 100 20 100 110 100
# 钱五叔 男 100 100 100 110 100
df.drop(['体育', '物理'], axis=1, inplace=True) # 删除体育和物理成绩
df.drop('王二姐', axis=0, inplace=True) # 删除王二姐那一行 加inplace=True才会修改df
print(df)
# 性别 语文 数学 English
# 刘一哥 男 20 115 107
# 张三妹 女 20 60 140
# 李四弟 男 20 100 110
# 钱五叔 男 100 100 110
df.drop([df.index[i] for i in range(1, 3)], axis=0, inplace=True) # 删除第1、2行
df.drop([df.columns[i] for i in range(3)], axis=1, inplace=True) # 删除第0-2列
print(df)
# English
# 刘一哥 107
# 钱五叔 110

4.读取和写入excel、csv

  • 需要openpyxl(对.xlsx文件)或xlrd或xlwt支持(老的.xls文件)
  • 读取的每张工作表都是一个DataFrame

 写excel

df.to_excel(filename, sheet_name="Sheet1", na_rep=' ',.....)

  • 将DataFrame对象df中的数据写入excel文档filename中的"Sheet1"工作表,NaN用' '代替
  • 会覆盖原有的filename文件
  • 如果要在一个excel文档中写入多个工作表,需要用 ExcelWrite 
# 读取excel文档
import
pandas as pd pd.set_option('display.unicode.east_asian_width', True) # 设置对齐 dt = pd.read_excel("excel_sample.xlsx", sheet_name=['销售情况', 1], index_col=0) # 读取第0张和第1张工作表,dt是字典,df是DataFrame df = dt['销售情况'] print(df.iloc[0, 0], df.loc['睡袋', '数量']) # 4080 4080 print(df) # 数量 销售额 成本 利润 # 产品类别 # 睡袋 4080 224192.9700 180501.270 43691.70000 # 彩盒 502 NaN 62452.410 -62452.41000 # 宠物用品 437 51558.4300 NaN 51558.43000 # 警告标 382 36796.6200 32100.230 4696.40000 # 总计 5401 312548.0199 275053.904 37494.11589 print(pd.isnull(df.loc['彩盒', '销售额'])) # True df.fillna(0, inplace=True) # 将NaN替换为0 print(df.loc['彩盒', '销售额'], df.iloc[2, 2]) # 0.0 0.0
# ---写入excel---
writer = pd.ExcelWriter("new.xlsx")     # 创建ExcelWriter对象
df.to_excel(writer, sheet_name="s1")
df.T.to_excel(writer, sheet_name="s2") # 转置矩阵写入
df.sort_values('销售额', ascending=False).to_excel(writer, sheet_name="s3")
# 将销售额排序的新DataFrame写入工作表s3
df['销售额'].to_excel(writer, sheet_name="s4")
writer.save()

读写csv

df.to_csv("result.csv", sep=",", na_rep='NA', float_format="%.2f", encoding=GBK)

df = pd.read_csv("result.csv")

 

posted @ 2021-05-26 14:52  李成敏  阅读(385)  评论(0编辑  收藏  举报