使用pandas库操作excel,csv表格操作大全

关注公众号“轻松学编程”了解更多,文末有公众号二维码,可以扫码关注哦。

前言

准备三份csv表格做演示:

成绩表.csv

subjects 小红 小强 小明 小兰 小刚
语文 65 76 90 80 90
数学 45 43 87 88 45
英语 99 86 86 80 86

成绩表1.csv

subjects 小红 小强 小明 小夏 小兰 小王 小刚 小亮
生物 78 67 78 89 77 76 98 100
地理 90 98 87 88 88 89 100 88
化学 87 78 86 98 86 76 87 87
化学 87 78 86 98 86 76 87 87
化学 87 78 86 98 86 76 87 87
地理 90 98 87 88 88 89 100 88

水果表.csv

color item price weeight
red apple 5.2 12
yellow banana 3.4 22
yellow orange 2.5 12
green banana 3.6 30
green orange 4.6 44
green apple 2 23

1、读取csv

# -*- coding: utf-8 -*-
import pandas as pd # 文件路径
file_name = r'C:\Users\ldc\Desktop\成绩表.csv'
# 由于文件中含有中文,所以使用gbk格式读取,其他常用的格式还有encoding='utf-8'
score_csv = pd.read_csv(file_name, encoding='gbk')

2、保存

# 文件名
file_new_name = r'C:\Users\ldc\Desktop\成绩表_新.csv'
# 写入csv,newline=''表示不添加空行
score_new = open(file_new_name, 'w', newline='')
# pd_score = pd.DataFrame([{'a': 1, 'b': 2}, {'a': 2, 'b': 5}]) # 将列表转换为DataFrame格式
# pd_score.to_csv(score_new, encoding='utf-8', index=False, line_terminator='\n')
score_csv.to_csv(score_new, encoding='utf-8', index=False, line_terminator='\n')

3、查看

3.1 查看文件行数与列数

print('1、文件内容\r\n', score_csv)
# 查看文件是几行几列,输出的是一个元祖(行数,列数)
print('2、文件行列', score_csv.shape)
# 查看文件有多少行
print('3、文件行数', len(score_csv)) # 方式一
print('4、文件行数', score_csv.shape[0]) # 方式二
# 查看文件有多少列
print('5、文件列数', score_csv.shape[1])

输出:

3.2 获取文件列名行号

# 获取列名
print('6、文件列名', list(score_csv.columns))
# print(score_csv.columns.to_list())
# 获取行号
print('7、文件行号', list(score_csv.index)) # 根据列名获取列号、下标
print('8、获取小明这一列的下标', score_csv.columns.get_loc('小明'))
# 根据列名获取内容
print('9、subjects内容\r\n', score_csv['subjects']) # 方式一
# print('subjects内容\r\n', score_csv.subjects) # 方式二
# print('转字典数据类型',dict(score_csv.subjects))

输出:

3.3 列转化成行索引

# 把列转化成索引,inplace=True会直接改变原来的行号
# score_csv.set_index('subjects', inplace=True)
# inplace=False则不改变原来的行号,这时把新的DataFrame付给一个新变量
score_csv_1 = score_csv.set_index('subjects', inplace=False) print('10、新的行号\r\n', score_csv_1) print('11、获取行号\r\n', list(score_csv_1.index))
# 根据[列][行]来获取值
print('12、[小明][数学]\r\n', score_csv_1['小明']['数学'])
print('原来行号\r\n', score_csv)

输出:

3.4 根据列号行号获取值

# 根据[列][行号]来获取值
print('13、[小明][0]来获取值\r\n', score_csv['小明'][0]) # 根据[列号][行号]来获取值
print('14、[第0列][第1行]来获取值\r\n', score_csv.iloc[0][1]) # 根据[行号][列号]来获取值
print('15、[第0行][第1列]来获取值\r\n', score_csv.loc[0][1]) # 行号都是从0开始,可以通过rename()来修改行号从1开始 score_csv_new_index = score_csv.rename(index={v: v + 1 for v in range(score_csv.shape[0])})
print('16、新的行号\r\n', score_csv_new_index)
print('17、[小明][1]', score_csv_new_index['小明'][1])

输出:

3.5 查看多列

# 获取多列
print('24、获取多列\r\n', score_csv[['小明', '小兰']])
# 从第2列取到最后一列
print('24、获取多列:从第2列取到最后一列\r\n', score_csv.iloc[:, 2:])
# 取第2列到第4列
print('24、获取多列:取第2列到第4列\r\n', score_csv.iloc[:, 2:5])

3.6 查看多行

# 获取多行
print('25、获取多行\r\n', score_csv.loc[[0, 1]])
# 从第一行取到最后一行
print('25、获取多行\r\n', score_csv.loc[1:]) # 取中间一部分
print('取中间一部分\r\n', score_csv.iloc[1:3, 2:4])

)]

4、倒置(转置)

# 转置(倒置),即行列转换
print('51、原数据\r\n', score_csv)
print('52、把csv行列互相转换\r\n', score_csv.T)

输出:

5、排序

5.1 列排序

# 列排序
# 对列索引进行重新排序
print('18、原数据\r\n', score_csv)
# by='列标签', axis=0 表示列轴,ascending=False表示降序,inplace=False表示返回一个新的数据
# 整体意思就是小兰这一列成绩按高到底排序,如果想按低到高则ascending=True即可
print('19、小兰这一列成绩按高到底排序\r\n', score_csv.sort_values(by='小兰', axis=0, ascending=False, inplace=False))

输出:

5.2 行排序

# 行排序
print('20、原数据\r\n', score_csv)
# 排序是按照数字来的,由于score_csv第一列不是数字,所以在排序时需要先把这一列删除
# 删除subjects列
score_csv_remove_subjects = score_csv.drop(['subjects'], axis=1)
# by=1,即第二行的值来升序排序,by=0表示第一行,因为行号是从0开始计算
print('21、按第二行升序排序\r\n', score_csv_remove_subjects.sort_values(by=1, axis=1, ascending=True))

输出:

5.3 行列排名

# 对数据进行排名处理,可以使用rank函数
print('22、显示每一行的排名\r\n', score_csv_remove_subjects.rank(axis=1, ascending=False, method='min'))
print('23、显示每一列的排名\r\n', score_csv_remove_subjects.rank(axis=0, ascending=False, method='min'))

6、分组

6.1 对列进行分组

# 读取水果价格表
fruit = pd.read_csv(r'C:\Users\ldc\Desktop\水果表.csv', encoding='utf-8')
print('26、水果价格表\r\n', fruit)
# 分组
# 查看水果有哪些种类,按item列分组
fruit_item = fruit.groupby(by='item')
print('27、查看水果种类:数量\r\n', dict(fruit_item.size()))

6.2 分组聚合操作

# 分组聚合操作之求均值
# 分组后的成员中可以被进行运算的值会进行运算,不能被运算的值不进行运算
# 比如求均值,只有数值型字段才能进行运算,而字符型字段不能进行运算,也不会进行运算。
print('28、分组后进行求均值\r\n', fruit_item.mean())
print('29、分组后进行求最大值\r\n', fruit_item.max())
print('30、分组后进行求最小值\r\n', fruit_item.min())

6.3 获取特定科目的均值

# 计算出苹果的平均价格
# 方式一:先对'item'分组,然后对'price'求均值,最后取'apple'的均值
print('32、获取苹果平均价格\r\n', fruit.groupby(by='item')['price'].mean()['apple'])
# 方式二:先对'item'分组,然后求均值,最后取'apple'中的'price'的均值
print('33、获取苹果平均价格\r\n', fruit.groupby(by='item').mean().loc['apple', 'price'])

6.4 把均价添加进表格

# 对分组后价格的均值添加进表中
# 方式一
mean_price = fruit.item.map(fruit.groupby(by='item')['price'].mean())
# print(mean_price)
fruit['mean_price'] = mean_price
print('35、把价格均价添加进表中\r\n', fruit)
# 方式二
fruit['mean_price'] = fruit.groupby('item')['price'].transform('mean')
print('37、把价格均价添加进表中\r\n', fruit)

6.5 对行进行分组

# 把subjects设置成行号
score_csv_1 = score_csv.set_index('subjects', inplace=False) # 对语文这一行进行分组,查看各个分数的人数
subjects_group = score_csv.groupby(score_csv_1.loc['语文'], axis=1, )
print('38、对语文分组\r\n', subjects_group.size())

7、修改

print('55、原数据\r\n', score_csv)
# 通过[行号,列名]修改数据
score_csv.loc[0, 'subjects'] = '化学'
print("56、修改[0, 'subjects']的值\r\n", score_csv)

8、新增

8.1 增加列

支持在最后一列增加、在特定位置增加一列、增加多列

# 新增一列
# 增加小亮的成绩,在最后一列后面添加
score_csv['小亮'] = [78, 90, 85]
print('39、在最后一面增加一列\r\n', score_csv)
# 在指定列号后面增加一列
score_csv.insert(loc=4, column='小夏', value=[90, 98, 99])
print('40、在第4列插入一列数据\r\n', score_csv)
score_csv.insert(loc=score_csv.columns.get_loc('小兰') + 1, column='小王', value=[67, 94, 65])
print('41、在小兰这一列后面插入一列数据\r\n', score_csv) # 新增多列
# 先获取列名
score_columns = score_csv.columns.to_list()
# 在指定位置增加新的列名,比如在小兰后面增加小玉、小华两列
add_index = score_columns[:score_columns.index('小兰') + 1] + ['小玉', '小华'] + score_columns[score_columns.index('小兰') + 1:]
# 按新列名重拍数据表,如果没有值就填充1
score_add_more_index = score_csv.reindex(columns=add_index, fill_value=1)
# 给新增的列增加数据,格式为[[小玉成绩1],[小华成绩1],[小玉成绩2],[小华成绩2],[小玉成绩3],[小华成绩3]],其中元素个数跟行数相等
score_add_more_index.loc[:, ('小玉', '小华')] = [[67, 78], [90, 78], [80, 90]] print('42、在小兰后面增加多列\r\n', score_add_more_index)

8.2 增加行

# 新增一行
score_csv.loc[3] = ['物理', 76, 54, 89, 95, 60, 98, 67, 89]
print('43、追加一行\r\n', score_csv) # 新增多行
subjects_new = [{'subjects': '历史', '小红': 89, '小强': 90, '小明': 87, '小夏': 97, '小兰': 76, '小王': 87, '小刚': 99, '小亮': 87},
{'subjects': '政治', '小红': 90, '小强': 97, '小明': 78, '小夏': 77, '小兰': 67, '小王': 87, '小刚': 89, '小亮': 76}
] score_csv_new = pd.concat([score_csv, pd.DataFrame(subjects_new)], ignore_index=True)
print('44、在后面增加多行\r\n', score_csv_new)
# 在第三行后面增加多行
score_csv_new_1 = pd.concat([score_csv.iloc[0:3], pd.DataFrame(subjects_new), score_csv.iloc[3:]], ignore_index=True)
print('45、在第三行后面增加多行\r\n', score_csv_new_1)

9、合并

支持把两个文件合并成一个文件

# csv合并
score_csv_other = pd.read_csv(r'C:\Users\ldc\Desktop\成绩表1.csv', encoding='gbk')
score_concat = pd.concat([score_csv, score_csv_other], ignore_index=True)
print('46、两个csv合并\r\n', score_concat)
print(score_csv_other)

10、删除

支持删除一列、多列、一行、多行数据

# 删除一列,inplace=False不改变原数据,inplace=True直接改变原数据,drop函数默认inplace=False
print('47、删除小明这一列\r\n', score_concat.drop(columns=['小明'], inplace=False))
# 删除多列
print('48、删除小明、小兰两列\r\n', score_concat.drop(columns=['小明', '小兰']))
# 删除一行 ,删除第二行,因为行号是从0开始的,所以是[1]
print('49、删除第二行\r\n', score_concat.drop(index=[1]))
# 删除多行
print('50、删除第一、二行\r\n', score_concat.drop(index=[0, 1]))

11、查重/去重

11.1 查看重复行

# 查看重复行
# 保留第一行重复值,返回如果有True,就说明有重复行,在True前面就是行号
print('53、查看重复行\r\n', score_csv_other.duplicated())
# 获取重复行索引
duplicated_indexs = score_csv_other.loc[score_csv_other.duplicated()].index
print('54、获取重复行索引\r\n', duplicated_indexs.to_list())

11.2 删除重复行

# 删除重复行
print(score_csv_other.drop_duplicates())

12、求和

行求和、列求和、行列汇总

# 行求和 行汇总
score_csv_other['行求和'] = score_csv_other.iloc[:, 1:].apply(lambda x: x.sum(), axis=1) print('54、行求和\r\n', score_csv_other) # 列求和 列汇总
score_csv_other.loc[score_csv_other.shape[0]] = score_csv_other.iloc[:, 1:].apply(lambda x: x.sum())
print('54、列求和\r\n', score_csv_other) score_csv_other.loc[score_csv_other.shape[0] - 1, 'subjects'] = '成绩总和'
print('行列汇总\r\n', score_csv_other)

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

pandas神器操作excel表格大全(数据分析数据预处理)的更多相关文章

  1. 用Python的pandas框架操作Excel文件中的数据教程

    用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...

  2. 利用 pandas库读取excel表格数据

    利用 pandas库读取excel表格数据 初入IT行业,愿与大家一起学习,共同进步,有问题请指出!! 还在为数据读取而头疼呢,请看下方简洁介绍: 数据来源为国家统计局网站下载: 具体方法 代码: i ...

  3. VS2010 C++ 操作Excel表格的编程实现

    转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...

  4. qt 操作excel表格

     自己编写的一个Qt C++类,用于操作excel表格,在Qt中操作excel需在.pro中增加CONFIG+=qaxcontainer配置. 1.打开Excel:objExcel = new QAx ...

  5. Python 利用Python操作excel表格之openyxl介绍Part2

    利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436) ## 绘图 c = LineChart()    ...

  6. 【转】python操作excel表格(xlrd/xlwt)

    [转]python操作excel表格(xlrd/xlwt) 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异, ...

  7. Python 利用Python操作excel表格之xlwt介绍

    利用Python操作excel表格之xlwt介绍   by:授客 QQ:1033553122 直接上代码   案例1 #!/usr/bin/env python # -*- coding:utf-8 ...

  8. 怎么把excel表格内的数据导入数据库?

    第一种方法: 思路:想要把excel表格内的数据直接导入数据库不是那么容易,可以把excel表格另存为.csv格式的文档(特点:内容以逗号分割):然后通过一系列的文档操作函数处理成为一个二维数组,然后 ...

  9. 用NPOI、C#操作Excel表格生成班级成绩单

    在C#中利用NPOI操作Excel表格非常方便,几乎上支持所有的Excel表格本身所有的功能,如字体设置.颜色设置.单元格合并.数值计算.页眉页脚等等. 这里准备使用NPOI生成一个班级成绩单Exce ...

随机推荐

  1. RabbitMQ小记(一)

    1.了解消息中间件 消息中间件,Message Queue Middleware,简称MQ,又称消息对列或消息对列中间件,利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式 ...

  2. Hibernate4.3 HQL查询

    HQL:Hibernate专属语言,可以跨数据库 一.基本查询 1 public void testQuery(){ 2 Session session = HibernateUtils.getSes ...

  3. django rest_framework serializer的ManyRelatedField 和 SlugRelatedField使用

    class BlogListSerializer(serializers.Serializer): id = serializers.IntegerField() user = BlogUserInf ...

  4. 【漏洞复现】PHPmyadmin 4.8.1后台Getshell新姿势

    原文地址:https://mp.weixin.qq.com/s/HZcS2HdUtqz10jUEN57aog 早上看到群里在讨论一个新姿势,phpmyadmin后台getshell,不同于以往需要知道 ...

  5. AE2018简单的编辑

    来源:https://jingyan.baidu.com/article/1876c8525cf522890a137651.html Ae 2018 怎样锁定图层,阻止对图层进行编辑? 听语音 原创 ...

  6. ACM蒟蒻的爪巴之路

    ACM蒟蒻的爪巴之路 从今天开始ACM菜狗yjhdd的博客之路就要开始啦~ 以后会不定时更新题解以及自己的理解感悟和收获(ง •_•)ง (多半是想划水的时候来写写博客Orz)

  7. 字节码暴力破解censum(老版本)

    声明 事先声明,本文仅提供破解方法以供个人及读者们学习Java字节码,不提倡破解程序. 本文是个人学习掘金小册张师傅的<JVM字节码从入门到精通>后,作为一个实践的记录,并无恶意. 关于c ...

  8. 基于空镜像scratch创建一个新的Docker镜像

    我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像.优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包. 比如我机器上docke ...

  9. lua 源码阅读 1.1 -> 2.1

    lua 1.1 阅读1. hash.c 中 a) 对建立的 Hash *array 用 listhead 链式结构来管理,新增lua_hashcollector,用来做 Hash 的回收处理. ps: ...

  10. 实验三 HTML表格和表单的制作

    实验三 HTML表格和表单的制作 [实验目的] 1.掌握表格的创建.结构调整与美化方法: 2.熟悉表格与单元格的主要属性及其设置方法: 3.掌握通过表格来进行网页页面的布局方法. [实验环境] 连接互 ...