pandas神器操作excel表格大全(数据分析数据预处理)

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

关注公众号“轻松学编程”了解更多,文末有公众号二维码,可以扫码关注哦。
在这里插入图片描述

前言

准备三份csv表格做演示:

成绩表.csv

subjects小红小强小明小兰小刚
语文6576908090
数学4543878845
英语9986868086

成绩表1.csv

subjects小红小强小明小夏小兰小王小刚小亮
生物78677889777698100
地理90988788888910088
化学8778869886768787
化学8778869886768787
化学8778869886768787
地理90988788888910088

水果表.csv

coloritempriceweeight
redapple5.212
yellowbanana3.422
yelloworange2.512
greenbanana3.630
greenorange4.644
greenapple223

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])

64-获取多行.png)]

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】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

公众号

赞赏码

posted @ 2020-06-08 23:24  轻松学编程  阅读(516)  评论(0编辑  收藏  举报