使用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. Centos-查看磁盘分区占用情况-df

    df 检查linux系统中磁盘分区占用情况 相关选项 -h 以人类友好读方式显示 -k 以KB为单位输出磁盘分区使用情况 -m   以MB为单位输出磁盘分区使用情况 -a 列出所有文件系统分区情况,包 ...

  2. 13.深入k8s:Pod 水平自动扩缩HPA及其源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 Pod 水平自动扩缩 Pod 水平自动扩缩工作原理 Pod 水平自动 ...

  3. windows10开机后恢复关机前打开的chrome网页

    开始-设置-账户-登录选项-隐私,下面一个"更新或重启后--"即第二个开关打开. 这时,无论是重启.更新重启或关机后开机,均可恢复原关机时的网页(和应用). 注:题主安装的wind ...

  4. 更改MySQL 5.7的数据库的存储位置

    操作系统:Windows 10 x64 MySQL安装包版本:mysql-installer-community-5.7.17.0 参考:MySQL 5.7版本的安装使用详细教程+更改数据库data的 ...

  5. sql注入里关键字绕过的发现

    网上大量文章,甚至<黑客攻防技术实战宝典-WEB实战篇>里面都说一些关键字如 select 等绕过可以用注释符/**/. 例如: select,union.可以用 ,se/**/lect, ...

  6. 轻松理解JVM的分代模型

    前言 上篇文章我们一起对jvm的内存模型有了比较清晰的认识,小伙伴们可以参考JVM内存模型不再是秘密这篇文章做一个复习. 本篇文章我们将针对jvm堆内存的分代模型做一个详细的解析,和大家一起轻松理解j ...

  7. (OK) Android内核(4.9)集成最新版MPTCP---成功

    Android内核(4.9)集成最新版MPTCP---成功

  8. rxjs入门3之项目中ajax函数封装

    项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...

  9. 要是想让程序跳转到绝对地址是0x100000去执行

    要对绝对地址0x100000赋值,我们可以用 (unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? *((void (* ...

  10. springboot2.2.2企业级项目整合redis与redis 工具类大全

    1.springboot2.2.2整合redis教程很多,为此编写了比较完整的redis工具类,符合企业级开发使用的工具类 2.springboot与redis maven相关的依赖 <depe ...