A. 在python中怎么在一个原有的DataFrame中加一新的列名
dataframe是神马?我只会json格式的数据转dict类型123import jsonj = json.loads(\\'{"name":"123","Age":22}\\') print(j) ========你是指pandas里的dataframe吗?传入dict参数实例化一下就行了
B. Python 数据处理(三十五)—— 文本数据处理
在 pandas 中,存储文本主要有两种方式
但一般建议使用 StringDtype 类型存储文本数据。都是由于各种原因,现在字符串数据的默认存储类型还是 object 。
要存储为 string 类型,需要显式的设置 dtype 参数
或者在创建 Series 或 DataFrame 之后,使用 astype 转换类型
也可以使用 StringDtype/"string" 转换其他非字符串类型的数据
转换现有数据的类型
StringDtype 类型对象与 object 类型之间存在一些差异
两个结果的输出都是 Int64 类型。将其与 object 类型比较
当存在 NA 值时,输出为 float64 。类似地,对于返回布尔值的方法
Series 和 Index 有一套字符串处理方法,可以方便地对数组的每个元素进行操作,最重要的是,这些方法会自动忽略缺失值。
这些方法可以通过 str 属性访问,通常具有与内置字符串方法相匹配的名称
Index 上的字符串方法对于清理或转换 DataFrame 的列特别有用。
例如,您可能有带有前导或后置空格的列
因为 df.columns 是一个 Index 对象,所以我们可以使用 .str 访问器
我们可以根据需要对列名进行处理,然后重新设置列名。
例如,我们删除列名的前后空格,并将其改为小写字母,同时用 _ 替换剩余的空格
split 方法会返回一个值为 list 的 Series
可以使用 get 或 [] 访问拆分后的列表中的元素
更简单的方法是设置 expand 参数,返回一个 DataFrame
当原来的 Series 包含 StringDtype 类型的数据时,输出列也将全部为 StringDtype
当然,也可以设置切割次数
它还有个对应的 rsplit 方法,从右边起始对字符串进行拆分
replace 参数支持使用正则表达式,前两个参数是 pat (匹配模式) 和 repl (替换字符串)
如果只是想要替换字符串字面值,可以将 regex 参数设置为 False ,而不需要对每个特殊字符进行转义。此时 pat 和 repl 参数必须是字符串
此外, replace 方法还接受一个可调用的替换函数,会使用 re.sub() 方法在每个匹配的模式上调用该函数
该函数需要传入一个正则对象作为位置参数,并返回一个字符串。例如
replace 方法的 pat 参数还接受 re.compile() 编译的正则表达式对象。所有的 flags 需要在编译正则对象时设置
如果在 replace 中设置 flags 参数,则会抛出异常
有几种方法可以将一个 Series 或 Index 与自己或其他的 Series 或 Index 相连接,所有这些方法都是基于 cat() 方法
可以连接一个 Series 或 Index 的内容
如果未指定 sep 参数,则默认为空字符串
默认会跳过缺失值,也可以使用 na_rep 指定缺失值的表示方式
cat() 的第一个参数 others 可以是类似列表的对象,但是其长度需要和调用对象一致
只要两个对象中存在缺失值,对应的结果中也是缺失值,除非指定了 na_rep
others 参数也可以是二维的,但是得保证其行数必须与调用的对象一致
对于 Series 或 DataFrame 的连接,可以通过设置 join 参数指定对齐方式
通常 join 可选范围为: 'left' , 'outer' , 'inner' , 'right' 。此时,不再要求两个对象长度一致
当 others 参数是 DataFrame 时,也可以使用
可以将一些类似数组的对象(如 Series , Index 等)放在一个类似列表的容器中,然后传递给 cat
对于没有索引的对象,其长度必须与调用 cat 的对象相同。但是 Series 和 Index 可以是任意的,除非设置了 json=None 。
如果在 others 参数上包含不同索引的对象,且设置了 join='right' ,则最后的结果将会是这些索引的并集
C. python对dataframe列里的元素进行修改
直接在参数一栏设置一下即可:
df=pd.read_csv('text.csv', dtype={'编号':str}
这样,把你要转换的列的名字设定好, “编号”列中的数据读取为str
这样,读取到的数据就是按照我们的要求的了。
D. Python基础命令都有什么
(1)打开csv文件
import pandas as pd
df=pd.read_csv(r’data/data.csv’)
(2)dataframe index 重新排序
data=df.sort_index(axis=0,ascending=False)
(3)dataframe 按照某一列进行升序或者降序排列
data=df.sort([‘date’],ascending=True升序,False降序)
(4)dataframe 的index重新从0开始
data=data.reset_index(drop=True)
(5)画横坐标是日期的图
import matplotlib.pyplot as plt
x=data[‘date’]#日期是字符串形式
y=data[‘close price’]
plt.plot_date(x,y)
(6)求标准差
import numpy as np
np.std
(7)下取整
import math
math.floor
上取整:math.ceil
(8)希尔伯特变换
from scipy import fftpack
hx= fftpack.hilbert(price)
(9)值排序
data.order()
(10)差分
data.diff(1)#一阶差分
dataframe 删除元素
data.drop(元素位置)
(11)嵌套的array处理方法
import itertools
a = [[1,2,3],[4,5,6], [7], [8,9]]
out = list(itertools.chain.from_iterable(a))
(12)dataframe修改列名
data.columns=[‘num’,’price’]
(13)excel表导入以后有空行解决办法
import numpy as np
data= data.drop(data.loc[np.isnan(data.name.values)].index)
(15)diff用法
一.是dataframe或者series格式,直接就用data.diff()
二.是list格式,先转换成转换成list格式data=data.tolist() 然后dif=np.diff(data)
(16)dataframe中的日期type不是date格式,不能直接相加减,所以先转换成list格式
t=data.time.tolist()
date_time = datetime.datetime.strptime(str(t),’%Y-%m-%d %H:%M:%S’)
date_time=datetime.date(date_time.year,date_time.month,date_time.day)
past= date_time - datetime.timedelta(days=n*365)
(17)符号化
np.sign
(18)字典的使用
label={‘11’:’TP’,’1-1’:’FN’,’-11’:’FP’,’-1-1’:’TN’}
for i in range(len(data1)):
state=str(int(data1[i]))+str(int(data2[i]))
result.append(label[state])
(19)用plt画图的时候中文不显示的解决办法
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r”c:windowsontssimsun.ttc”, size=15)
plt.title(u’中文’, fontproperties=font_set)
(20)获取当前程序运行的时间
from time import time
time1=time()
time2=time()
print(time2-time1)
以上是我找到的资料,对于我这个学习Python到半吊子的人来说也是要收藏起来的。
E. python 怎么添加列名(表头)
添加列名:
pd.read_csv(file, header=None, names = ['a','b','c'] )1
names为指定的名字
数据tab分隔的时候去读方式
sep指定
df = pd.read_csv('../input/data_train.csv',sep = '\t',encoding='GBK')
F. 09.pandas修改列名、索引名字
有时候我们需要修改DataFrame的个别列名或者索引,避免重复、方便使用。
这时就需要使用到rename()函数,rename()函数使用时比较简单。
源数据
现在我们想要把'表1Lat'和'表1Lon'改为维度和经度:
其中columns代表要对列名进行修改,在Python的pandas库里面,跟列名有关的一般都是用columns,而不是用names。在columns后面是一个字典形式,键是原列名,值是新列名。修改的时候只会改选择到的列。注意修改只会要写入源数据时需要赋值或者用inplace = True。
rename()函数适合于修改个别的索引或者列名,如果需要大部分的修改或者全部修改的话就使用set_index()函数比较方便。
多层索引或者列名怎么修改?
G. Python其实很简单 第二十一章 DataFrame数据处理
将Excel中的的数据读入数据框架DataFrame后,可以非常方便的进行各种数据处理。
21.1 列间求和
求总分(总分=语文+数学+英语)
对于上一章所提到的学生成绩表,仅用一个语句即可完成总分计算,并填充。
df['总分']=df['语文']+df['数学']+df['英语']
完整代码如下:
from pandas import read_excel
file='d:/student.xlsx' #见第18章表18-1
df=read_excel(file,sheet_name=0,converters={'学号':str})
df['总分']=df['语文']+df['数学']+df['英语']
print(df.head()) #df.head()的作用是仅显示5行记录。
运行结果如下:
序号 学号 姓名 年级 班级 语文 数学 英语 总分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 248 NaN
1 2 070102 陈冠涛 NaN NaN 89 89 89 267 NaN
2 3 070103 李文博 NaN NaN 89 72 76 237 NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 267 NaN
4 5 070205 林若溪 NaN NaN 91 95 83 269 NaN
21.2替换
既可以将对满足条件的行和列的数据替换,也可以对整个集合的数据按照条件进行替换。
df['总分'].replace(310,'x',inplace=True)
将总分列的数值“310”替换为“x”。inplace=True表示改变原数据。
df.replace(76,0,inplace=True)
将整个DataFrame中的数值“76”替换为“0”。
df.replace([98,76,99],0,inplace=True)
将整个DataFrame中的数值“98,76,99”一次替换为“0”。
21.2排序
既可以将某一列作为关键字段排序,也可以将几个列分别作为主、次关键字段进行排序。排序既可以按升序排序,也可以按降序排序。
函数sort_values()的语法格式如下:
df.sort_values(by=[“col1”,”col2”,......,”coln”],ascending=False)
其中,coln表示列名,也可以是列名的列表;ascending表示排序方式,值为True表示升序,可以省缺,值为False表示降序。
如:
df=df.sort_values(by=['总分'],ascending=False)
表示按照“总分”从高到低排序。
df=df.sort_values(by=['总分','语文'],ascending=False)
表示按照“总分”从高到低排序,若“总分”相同,再按照“语文”成绩从高到低排序。
21.3 字段截取
函数slice()可以从某列中截取字符串。格式如下:
slice(start,stop)
其中,start表示开始位置;stop表示结束位置
例:
df['年级']=df['学号'].str.slice(0,2)
通过此语句可以截取学号字段的第1、2个字符,并赋值给年级字段。
21.4 记录抽取
可以抽取满足条件的记录。
例:抽取总分>300的记录。
df[df.总分>300]
抽取总分在300到310之间(包括300和310)的记录。
df[df.总分.between(306,310)]
抽取学号中包含“0803”的记录。这样可以非常方便的抽取某个班的信息。
df[df.学号.str.contains(',na=False)]
此处的na=False,含义是如遇到NaN这样的数据,直接做不匹配处理。
21.5修改记录
1、整列替换
我们在前面已经给整列填充过数据,填充时原来的数据就被覆盖了。
即如下语句:
df['总分']=df['语文']+df['数学']+df['英语']
2、个别修改
如将值‘99’替换为值‘100’,可用如下语句:
df.replace(ྟ',颼')
将指定列的值替,如将语文列和英语列的值‘99’替换为值‘100’,可用如下语句:
df.replace({'语文':99,'英语':99},100)
可用如下程序去验证:
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'学号':str})
print(df[(df.语文==99) |(df.英语==99)])
df=df.replace({'语文':99,'英语':99},100)
print(df[(df.语文==99) |(df.英语==99)])
运行结果为:
序号 学号 姓名 年级 班级 语文 数学 英语 总分 名次
28 29 090802 丁能通 09 NaN 119 120 99 338 NaN
29 30 090203 沈丹妮 09 NaN 109 108 99 316 NaN
Empty DataFrame
Columns: [序号, 学号, 姓名, 年级, 班级, 语文, 数学, 英语, 总分, 名次]
Index: []
可以看出,第一个print()语句输出的结果中满足条件“语文或英语为99分”的有两条记录,替换语句执行以后,df中再没有满足条件“语文或英语为99分”的记录了。
21.6记录合并
函数concat()的格式如下:
concat([dataFrame1,dataFrame2,......],ignore_index=True)
其中,dataFrame1等表示要合并的DataFrame数据集合;ignore_index=True表示合并之后的重新建立索引。其返回值也是DataFrame类型。
concat()函数和append()函数的功能非常相似。
例:
import pandas #导入pandas模块
from pandas import read_excel #导入read_execel
file='d:/student.xlsx' #变量file表示文件路径,注意'/'的用法 数据见第18章表18-1
df=read_excel(file,sheet_name=0,converters={'学号':str})
# 将Excel文件导入到DataFrame变量中
df=df[:5] #截取df的前5个记录
print(df) #输出df
df1=df[:3] #截取df的前3个记录存入df1中
df2=df[3:5] #截取df的最后2个记录存入df2中
df3=pandas.concat([df2,df1]) #将df2与df1合并存入df3中
print(df3) #输出df3
运行结果如下:
序号 学号 姓名 年级 班级 语文 数学 英语 总分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陈冠涛 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
序号 学号 姓名 年级 班级 语文 数学 英语 总分 名次
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陈冠涛 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
由于合并时是将df1合并到df2中,可以看出,索引仍然保持原来的状态。
21.7统计次数
可以用如下方法统计出某个值在某行或者某个范围出现的次数。
from pandas import read_excel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'学号':str})
df=df[:5]
print(df)
print(df['语文'].value_counts())
输出结果如下:
序号 学号 姓名 年级 班级 语文 数学 英语 总分 名次
0 1 070101 王博宇 NaN NaN 84 71 93 NaN NaN
1 2 070102 陈冠涛 NaN NaN 89 89 89 NaN NaN
2 3 070103 李文博 NaN NaN 89 72 76 NaN NaN
3 4 070204 姜海燕 NaN NaN 89 89 89 NaN NaN
4 5 070205 林若溪 NaN NaN 91 95 83 NaN NaN
89 3
84 1
91 1
Name: 语文, dtype: int64
可以看出,通过value_counts()函数可以统计出列中各值出现的次数。
value_counts()函数的参数还有 :
ascending,当ascending=True时升序排列,当ascending=False时升序排列(此时该参数可省缺);
normalize,当normalize=True时,显示的不再是各值出现的次数,而是占比。
将上例中的语句print(df['语文'].value_counts())改为:
print(df['语文'].value_counts(ascending=True,normalize=True))
则输出结果变成了:
91 0.2
84 0.2
89 0.6
Name: 语文, dtype: float64
21.8按值查找
print(df['语文'].isin([84,91]))
它的作用是查找‘语文’列中值和isin所指的列表中元素一致的记录,如果找到结果为True,否则为False。
输出结果:
0 True
1 False
2 False
3 False
4 True
Name: 语文, dtype: bool
21.9数据分区
根据某个分区标准,将数据按照所属区域进行划分,并用相应的标签表示,可以用cut()方法来实现。
语法格式如下:
cut(series, bins, right=True, labels=NULL)
其中:
series表示需要分组的数据;
bins表示分组的依据,是一个列表,其元素为划分分区的边界值,如[0,72,96,120],就是划分3个分区,即0~72、72~96、96~120,默认的是“左包右不包”;
right表示分组时右边是否闭合;
labels表示分组的自定义标签,也可以不重新定义。
下面对上述学生成绩表中的语文成绩进行分组,并增加一个新的列“语文等级”。
import pandas as pd
from pandas import read_excel #导入read_execel
file='d:/student.xlsx'
df=read_excel(file,sheet_name=0,converters={'学号':str})
df['年级']=df['学号'].str.slice(0,2)
df['班级']=df['学号'].str.slice(0,4)
df.总分=df.语文+df.数学+df.英语
bins=[0,72,96,max(df.语文)+1] #
lab=['不及格','及格','优秀']
grade=pd.cut(df.语文,bins,right=False,labels=lab)
df['语文等级']=grade
print(df.head())
print("语文成绩分等级统计结果:")
print(df['语文等级'].value_counts())
运行结果如下:
序号 学号 姓名 年级 班级 语文 数学 英语 总分 语文等级
0 1 070101 王博宇 07 0701 84 71 93 248 及格
1 2 070102 陈冠涛 07 0701 89 89 89 267 及格
2 3 070103 李文博 07 0701 89 72 76 237 及格
3 4 070204 姜海燕 07 0702 89 89 89 267 及格
4 5 070205 林若溪 07 0702 91 95 83 269 及格
语文成绩分等级统计结果:
及格 17
优秀 10
不及格 4
Name: 语文等级, dtype: int64
H. python pandas怎么设置列名
首先是引入pandas和numpy,这是经常配合使用的两个包,pandas依赖于numpy,引入以后我们可以直接使用np/pd来表示这个两个模块
先创建一个时间索引,所谓的索引(index)就是每一行数据的id,可以标识每一行的唯一值
为了快速入门,我们看一下如何创建一个6X4的数据:r
I. python对excel操作
Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了!
操作xls文件
xlrd(读操作):
import xlrd
1、引入xlrd模块
workbook=xlrd.open_workbook("36.xls")
2、打开[36.xls]文件,获取excel文件的workbook(工作簿)对象
names=workbook.sheet_names()
3、获取所有sheet的名字
worksheet=workbook.sheet_by_index(0)
4、通过sheet索引获得sheet对象
worksheet为excel表第一个sheet表的实例化对象
worksheet=workbook.sheet_by_name("各省市")
5、通过sheet名获得sheet对象
worksheet为excel表sheet名为【各省市】的实例化对象
nrows=worksheet.nrows
6、获取该表的总行数
ncols=worksheet.ncols
7、获取该表的总列数
row_data=worksheet.row_values(n)
8、获取该表第n行的内容
col_data=worksheet.col_values(n)
9、获取该表第n列的内容
cell_value=worksheet.cell_value(i,j)
10、获取该表第i行第j列的单元格内容
xlwt(写操作):
import xlwt
1、引入xlwt模块
book=xlwt.Workbook(encoding="utf-8")
2、创建一个Workbook对象,相当于创建了一个Excel文件
sheet = book.add_sheet('test')
3、创建一个sheet对象,一个sheet对象对应Excel文件中的一张表格。
sheet.write(i, j, '各省市')
4、向sheet表的第i行第j列,写入'各省市'
book.save('Data\\36.xls')
5、保存为Data目录下【36.xls】文件
操作xlsx文件
openpyxl(读操作):
import openpyxl
1、引入openpyxl模块
workbook=openpyxl.load_workbook("36.xlsx")
2、打开[36.xlsx]文件,获取excel文件的workbook(工作簿)对象
names=workbook.sheetnames
worksheet=workbook.worksheets[0]
worksheet=workbook["各省市"]
ws = workbook.active
6、获取当前活跃的worksheet,默认就是第一个worksheet
nrows=worksheet.max_row
7、获取该表的总行数
ncols=worksheet.max_column
8、获取该表的总列数
content_A1= worksheet['A1'].value
9、获取该表A1单元格的内容
content_A1=worksheet.cell(row=1,column=1).value
10、获取该表第1列第1列的内容
openpyxl(写操作):
workbook=openpyxl.Workbook()worksheet = workbook.active
3、获取当前活跃的worksheet,默认就是第一个worksheet
worksheet.title="test"
4、worksheet的名称设置为"test"
worksheet = workbook.create_sheet()
5、创建一个新的sheet表,默认插在工作簿末尾
worksheet.cell(i,j,'空')
6、第i行第j列的值改成'空'
worksheet["B2"]="空"
7、将B2的值改成'空'
worksheet.insert_cols(1)
8、在第一列之前插入一列
worksheet.append(["新增","台湾省"])
9、添加行
workbook.save("Data\\36.xlsx")
10、保存为Data目录下【36.xlsx】文件
pandas处理excel文件
pandas操作:
import pandas as pd
1、引入pandas模块
data = pd.read_excel('36.xls')
2、读取[36.xls]或者[36.xlsx]文件
data = pd.read_csv('36.csv')
3、读取[36.csv]文件
data=data.dropna(subset=['店铺'])
4、过滤掉data店铺列有缺失的数据
data.sort_values("客户网名", inplace=True)
5、将data数据按照客户网名列进行从小到大排序
data = pd.read_csv(36.csv, skiprows = [0,1,2],sep = None, skipfooter = 4)
6、读取[36.csv]文件,前三行和后四行的数据略过
data = data.fillna('空')
7、将data中的空白处填充成'空'
data.drop_plicates('订单','first',inplace=True)
8、data中的数据,按照【订单】列做去重处理,保留第一条数据
data=pd.DataFrame(data,columns=['订单','仓库'])
9、只保留data中【订单】【仓库】列的数据
data = data[(data[u'展现量'] > 0)]
10、只保留【展现量】列中大于0的数据
data= data[data["订单"].str.contains('000')]
11、只保留【订单】列中包含'000'的数据
data= data[data["仓库"]=='正品仓']
12、只保留【仓库】列是'正品仓'的数据
xs= data[data["店铺"]=='南极人']['销售额']
13、获取店铺是南极人的销售额数据
data['订单'] = data['订单'].str[3:7]
14、【订单】列的值只保留4-8个字节的值
data["邮资"] = np.where((data['店铺'].str.contains('T|t')) & -(data['仓库'] == '代发仓'), 8, data['邮资'])
15、满足店铺列包含 T 或 t 并且仓库不等于'代发仓'的话,将邮资的值改成8,否则值不变
data = np.array(data).tolist()
16、将data从DataFrame转换成列表
data=pd.DataFrame(data)
17、将列表转换成DataFrame格式
zhan = data[u'展现'].sum().round(2)
18、将data中所有展现列数据求和,并取两位小数
sum=data.groupby(['店铺'])['刷单'].sum()
19、将data中按照店铺对刷单进行求和
counts=data['店铺'].value_counts()
20、将data按照店铺进行计算
avg=data.groupby(['店铺'])['刷单'].mean()
21、将data按照店铺对刷单进行求平均数
count = pd.concat([counts,sum], axis=1, ignore_index=True, sort=True)
22、将counts和sum两个DataFrame进行了组合
count=count.rename(index=str, columns={0: "订单", 1: "成本"})
23、将新生成的DataFrame列名进行修改
data = pd.merge(sum, counts, how='left', left_on='店铺', right_on='店铺')
24、将列表转换成DataFrame格式
from openpyxl import Workbook
wb=Workbook()
ws1=wb.active
data.to_excel('36.xlsx')
wb.close()
25、data完整的写入到关闭过程,执行此操作的时候【36.xlsx】不能是打开状态
excel格式操作
样式处理:
1、打开【36.xlsx】
sheet=workbook.worksheets[0]
2、将第一个sheet对象赋值给sheet
sheet.column_dimensions['A'].width = 20.0
3、将A列的宽度设置为20
sheet.row_dismensions[1].height = 20.0
4、将第一行的行高设置为20
sheet.merge_cells('A1:A2')
5、将sheet表A1和A2单元格合并
sheet.unmerge_cells('A1:A2')
6、将sheet表A1和A2单元格取消合并
sheet.insert_rows(2,2)
7、将sheet表从第2行插入2行
sheet.insert_cols(3,2)
8、将sheet表从第3列插入2列
sheet.delete_rows(2)
9、删除第2行
sheet.delete_cols(3, 2)
10、将sheet表从第3列开始删除2列
from openpyxl.styles import Font, Border, PatternFill, colors, Alignment
11、分别引入字体、边框、图案填充、颜色、对齐方式
sheet.cell(i,j).font = Font(name='Times New Roman', size=14, bold=True, color=colors.WHITE)
12、设置sheet表第 i 行第 j 列的字体
sheet.cell(i,j).alignment = Alignment(horizontal='center', vertical='center')
13、设置sheet表第 i 行第 j 列的字体对齐方式
left, right, top, bottom = [Side(style='thin', color='000000')] * 4sheet.cell(i,j).border = Border(left=left, right=right, top=top, bottom=bottom)
14、引入边框样式并调用
fill = PatternFill("solid", fgColor="1874CD")sheet.cell(1,j).fill = fill
15、引入填充样式,并调用
import xlrd
from openpyxl import Workbook
from openpyxl import load_workbook
workbook=load_workbook(filename='C:/Users/EDZ/Desktop/工作/2021.08.03/大兄弟.xlsx')
sheet=workbook.active
sheet.insert_cols(idx=1)
sheet.merge_cells(A1:A3)
sheet['A1']=['上海','山东','浙江']
J. Python其实很简单 第十九章 Pandas之Series与DataFrame
19.1安装Anaconda
Anaconda是Python的一个开源发行版本,它预装了丰富的第三方库,而且主要面向科学计算和数据分析,使用起来要比原版的Python更省时省力。
Anaconda官方下载网址为:https://www.continuum.io/downloads。下载和安装的方法很简单,若有问题可以在网上搜索相关内容学习解决。
安装Anaconda之后,就会发现在Anaconda目录下同时安装了Jupyter Notebook、Spyder等工具,我们接下来主要使用Spyder进行开发。关于Spyder的使用方法非常简单,大家也可以去网上搜索学习。
虽然Anaconda已经预装了很多常用的包,但有时我们也需要自己安装一些包。可以在开始菜单中选择“Anaconda Anaconda Prompt”命令,在命令行输入conda install ( 代表包名)即可安装,也可以输入pip install 。
19.2数据分析包Pandas
Pandas是Python的一个数据分析包,Anaconda安装时已经附带安装了Pandas包。
Pandas数据结构有三种:Series(一维数组)、DataFrame(二维数组)和Panel(三维数组),其中最常用的是前两种数据结构。
19.2.1 Series
Series(序列)用于存储一行或一列数据,以及与之相关的索引的集合。
语法格式如下:
Series([数据1,数据2,......], index=[索引1,索引2,......])
例:
from pandas import Series
s=Series(['张三','李四','王五'],index=[1,2,3])
print(s)
输出结果如下:
1 张三
2 李四
3 王五
dtype: object
上面建立序列时指定了索引,若不指定,则默认的索引值从0开始。如下:
s=Series(['张三','李四','王五'])
输出结果为:
0 张三
1 李四
2 王五
dtype: object
索引值也可以为字符串。如下:
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
print(s)
输出结果为:
A 张三
B 李四
C 王五
dtype: object
1、访问序列
(1)可以通过索引访问序列,如:
from pandas import Series
s=Series(['张三','李四','王五'])
print(s)
print(s[0])
print(s[1:])
运行结果如下:
0 张三
1 李四
2 王五
dtype: object #print(s)输出
张三 #print(s[0])输出
1 李四
2 王五
dtype: object #print(s[1:])输出
(2)通过值获取索引值
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
print(s.index[s.values=='李四'])
运行结果:
Index(['B'], dtype='object')
(3)判断值是否存在
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
f='李四' in s.values
print(f)
运行结果:
True
(4)定位获取
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
print(s[[0,2,1]])
运行结果:
A 张三
C 王五
B 李四
dtype: object
2、修改序列
(1)追加序列,如:
from pandas import Series
s=Series(['张三','李四','王五'],index=['A','B','C'])
s1=Series(['孙六'],index=['D'])
s=s.append(s1)
print(s)
运行结果:
A 张三
B 李四
C 王五
D 孙六
dtype: object
(2)修改序列的值
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s[1]='李飞'
print(s)
运行结果:
A 张三
B 李飞
C 王五
D 孙六
dtype: object
不知道索引,仅知道要修改的值,也可通过值查找到索引后,再修改序列的值。如:
s[s.index[s.values=='李四']]='李飞'
这样也可以将“李四”修改为“李飞。
(3)修改索引
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s.index=[0,1,2,3]
print(s)
运行结果:
0 张三
1 李四
2 王五
3 孙六
dtype: object
(4)删除元素
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s=s.drop('A')
print(s)
运行结果:
B 李四
C 王五
D 孙六
dtype: object
(5)重新排序
可以按照索引排序,使用sort_index(ascending=True)方法对index进行排序操作。
from pandas import Series
s=Series(['张三','李四','王五','孙六'],index=['A','B','C','D'])
s=s.sort_index(ascending=False) # ascending=False表示按降序排列
print(s)
运行结果:
D 孙六
C 王五
B 李四
A 张三
dtype: object
(6)重置索引
重置索引可以使用reindex()。如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。
s=s.reindex(['D','C','B','A'])
如果index列表中的元素多于序列的值,可用fill_value=0这样的语句填充。
s=s.reindex(['D','C','B','A'], fill_value=0)
19.2.2 DataFrame
DataFrame(数据框架)用于存储多行和多列的数据集合。它是Series的容器,类似于Excel中二维表格。
定义一个DataFrame的语法格式如下:
df=DataFrame({列名1 : 序列1,列名2 : 序列2,.......列名n : 序列n}, index=序列 )
例如,有如下二维表:
姓名
性别
年龄
张三
男
18
李四
女
19
王五
男
17
保存到DataFrame中可以用如下方法:
from pandas import Series
from pandas import DataFrame
name=Series(['张三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性别':sex,'年龄':age})
print(df)
运行结果:
姓名 性别 年龄
0 张三 男 18
1 李四 女 19
2 王五 男 17
从上例可以看出,虽然我们省缺了索引,但系统自动添加了从0开始的索引值。
19.3 DataFrame的基本操作
1、访问方式
(1)获取行
print(df[1:2]) # 获取第1行的值
输出结果:
姓名 性别 年龄
1 李四 女 19
print(df[1:3]) #获取第1行到第2行的值
输出结果:
姓名 性别 年龄
1 李四 女 19
2 王五 男 17
(2)获取列
print(df['姓名']) #获取“姓名”列的值
输出结果:
0 张三
1 李四
2 王五
Name: 姓名, dtype: object
另一种方法:
print(df[df.columns[0:1]]) #先按照索引号获取列名,再按照列名读取
输出结果和上面的方法完全一致。
还有一种情况,是获取唯一值,即将列内的重复值中多余的删除,仅留下互不相同的值。所用的到方法是unique()。
sex1=Series(df['性别'].unique())
print(sex1)
输出结果:
0 男
1 女
dtype: object
(3)获取指定位置的值
print(df.at[1,'姓名']) # 格式为变量名.at[行号,列名]
输出结果:
李四
(4)获取块的值
print(df.iloc[0:2,1:3]) # 格式为变量名.iloc[行号1:行号2, 列号1:列号2]
输出结果:
性别 年龄
0 男 18
1 女 19
print(df.iloc[:,1:2]) #获取“性别”列的值
运行结果:
性别
0 男
1 女
2 男
2、修改、删除、增加行和列
(1)修改列名
print(df.columns)
df.columns=['name','sex','age']
print(df.columns)
输出结果:
Index(['姓名', '性别', '年龄'], dtype='object')
Index(['name', 'sex', 'age'], dtype='object')
可见,列名已经由“姓名、性别、年龄”修改为“age、sex、age”了。但这种修改必须把全部列名都一一列举,不能有遗漏,否则就会出错。如:
df.columns=['name','sex']
此时会报错:ValueError: Length mismatch: Expected axis has 3 elements, new values have 2 elements。
(2)修改行索引
df.index=[1,2,3]
(3)删除行
df.drop(1,axis=0) # axis=0表示行轴,也可以省略
(4)删除列
df.drop(‘性别’,axis=1) # axis=0表示列轴
也可以使用另一种方法:
del df['性别']
(5)增加列
df['电话']=[',',']
print(df)
运行结果:
姓名 性别 年龄 电话
0 张三 男 18 1111111
1 李四 女 19 2222222
2 王五 男 17 3333333
(6)增加行
df.loc[len(df)]=['孙六','男',ཐ']
(7)追加
from pandas import Series
from pandas import DataFrame
name=Series(['张三','李四','王五'])
sex=Series(['男','女','男'])
age=Series([18,19,17])
df=DataFrame({'姓名':name,'性别':sex,'年龄':age}) # 建立DataFrame,变量名为df
name1=Series(['孙六','候七'])
sex1=Series(['男','女'])
age1=Series([19,17])
df1=DataFrame({'姓名':name1,'性别':sex1,'年龄':age1})
# 建立DataFrame,变量名为df1
df=df.append(df1,ignore_index=True)
# 将对df1追加到df后面,参数ignore_index=True表示重新索引
print(df)
运行结果:
姓名 性别 年龄
0 张三 男 18
1 李四 女 19
2 王五 男 17
3 孙六 男 19
4 候七 女 17