1.pandas介绍
pandas是Python的数据分析的核心库,它提供了一系列能够快速、便捷 的处理结构化数据的数据结构和函数。Python之所以成为强大而高效的数据分析环 境与它息息相关。
pandas兼具NumPy高性能的数组计算功能以及电子表格和关系型数据库灵活的数据处理功能。
2.pandas网址
参见https://blog.csdn.net/Yan_Joy/article/details/78095115
3.引pandas包
import pandas [as 别名]
如 import pandas as pd
4.pandas提供的主要数据结构
- Series: 用于处理一维数据。
Series是一种类似于数组的一维数据结构,包含了一系列的元素以及元素对应 的标签。
*元素的标签称为index。*
- DataFrame:用于处理二维数据。
DataFrame是一种带标签的二维数据结构,其中各列可以存储不同的数据类型。
1.series
定义:
from pandas import Series
print("第一种定义方式:基于字典创建")
s1 = Series({"a":1,"b":2,"c":3})
print("s1的值为:",s1.values)
print("s1的索引为:",s1.index)
print("\n")
print("第二种定义方式:定义时指定index")
s2 = Series([2,8,-7,-2,1],index=['a','b','c','d','e'])
print("s2的值为:",s2.values)
print("s2的索引为:",s2.index)
############运行结果############
第一种定义方式:基于字典创建
s1的值为: [1 2 3]
s1的索引为: Index(['a', 'b', 'c'], dtype='object')
第二种定义方式:定义时指定index
s2的值为: [ 2 8 -7 -2 1]
s2的索引为: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
访问:
s1 = Series({"a":1,"b":2,"c":3})
s2 = Series([2,8,-7,-2,1],index=['a','b','c','d','e'])
#单值
print("s2[2],s2['b']的结果是:\n",s2[2],s2['b'])
#多元素访问
print("s2[['a','d','c']]的结果是:\n",s2[['a','d','c']])
#切片
print("s2[:2]的结果是:\n",s2[:2])
print("s2[2:]的结果是:\n",s2[2:])
print("s2[-3:]的结果是:\n",s2[-3:])
############运行结果############
s2[2],s2['b']的结果是:
-7 8
s2[['a','d','c']]的结果是:
a 2
d -2
c -7
dtype: int64
s2[:2]的结果是:
a 2
b 8
dtype: int64
s2[2:]的结果是:
c -7
d -2
e 1
dtype: int64
s2[-3:]的结果是:
c -7
d -2
e 1
dtype: int64
运算操作:*,过滤,map,索引
s4=Series([10,2,47,12,1],index=['a','b','c','d','e'])
print("s4*2输出为:\n",s4*2) #不会修改原来的s4
############运行结果############
s4*2输出为:
a 20
b 4
c 94
d 24
e 2
dtype: int64
过滤
#过滤
print("s4[s4>1]过滤操作结果为:\n",s4[s4>1])
############运行结果############
s4[s4>1]过滤操作结果为:
a 10
b 2
c 47
d 12
dtype: int64
map
#map:判断索引里面有没有,
#'b' in s4 ='b' in s4.index
print("'a'in s4的结果是:\n",'a'in s4)
print("'g'in s4的结果是:\n",'g'in s4)
############运行结果############
'a'in s4的结果是:
True
'g'in s4的结果是:
False
#可更改索引
print("s4.index的结果是:\n",s4.index) #返回时一个别的
s4.index = list('zxcvb')
print("s4.index = list('zxcvb')的结果是:\n",s4.index)
############运行结果############
s4.index的结果是:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
s4.index = list('zxcvb')的结果是:
Index(['z', 'x', 'c', 'v', 'b'], dtype='object')
2.DataFrame
定义
from pandas import DataFrame
data1 = {'int':[1,2,3],
'float':[1.2,3.1,3.5],
'string':['a','b','c']}
df1 = DataFrame(data1)
print("df1是:",df1)
print("这样的顺序可能会有错误,可以指定column顺序和index值")
df2 = DataFrame(data1,columns=['float','string','int','na_column'],index = ['x','y','z'])
print(df2)
############运行结果############
df1是: int float string
0 1 1.2 a
1 2 3.1 b
2 3 3.5 c
这样的顺序可能会有错误,可以指定column顺序和index值
float string int na_column
x 1.2 a 1 NaN
y 3.1 b 2 NaN
z 3.5 c 3 NaN
3.Series和DataFrame区别
print("s1的类型是",type(s1))
print("df1的类型是",type(df1))
############运行结果############
s1的类型是 <class 'pandas.core.series.Series'>
df1的类型是 <class 'pandas.core.frame.DataFrame'>
获取:
data2 = {'int':[1,2,3,4],
'float':[1.2,3.1,3.5,4.4],
'string':['a','b','c','d']}
df2 = DataFrame(data2)
#获取一列
s1 = df2.int
print("s1 = df2.int的获取结果是:\n",s1) # print(s1= df2.int)会出现错误
############运行结果###########
s1 = df2.int的获取结果是:
0 1
1 2
2 3
3 4
Name: int, dtype: int64
两种形式:
s1 = df2.int
s2 = df2[‘float’]
print("s1类型是",type(s1))
print("\n")
s2 = df2['float']
print("s2 = df2['float']的获取结果是:\n",s2)
print("\n")
print("s2类型是",type(s2))
############运行结果###########
s1类型是 <class 'pandas.core.series.Series'>
s2 = df2['float']的获取结果是:
0 1.2
1 3.1
2 3.5
3 4.4
Name: float, dtype: float64
s2类型是 <class 'pandas.core.series.Series'>
删除:
#删除列
print("原DataFrame是:\n",df2)
del df2['int']
print("删除后的DataFrame是:\n",df2)
############运行结果###########
原DataFrame是:
int float string
0 1 1.2 a
1 2 3.1 b
2 3 3.5 c
3 4 4.4 d
删除后的DataFrame是:
float string
0 1.2 a
1 3.1 b
2 3.5 c
3 4.4 d
增加:
#增加列
import pandas as pd
df2['int1']=pd.Series([10,20,30],index=['x','y','z'])
print("添加后的df2为:\n",df2['int1'])
############运行结果###########
添加后的df2为:
0 NaN
1 NaN
2 NaN
3 NaN
x 10.0
y 20.0
z 30.0
Name: int1, dtype: float64
获取行:
#获取行
row = df2.loc['x'] #按索引
print ("df2.loc['x']的结果是:\n",row)
row1 = df2.iloc[2]
print("df2.iloc[2]的结果是:\n",row1)#按位置
row3 = df2[1:2] #行切片
print(" df2[1:2]的结果是:\n",row3)
############运行结果###########
df2.loc['x']的结果是:
float 4.8
int 4
int1 10
string d
Name: x, dtype: object
df2.iloc[2]的结果是:
float 3.5
int NaN
int1 NaN
string c
Name: 2, dtype: object
df2[1:2]的结果是:
float int int1 string
1 3.1 NaN NaN b
拓展行:
#扩展行
data = {'int':[4], 'float':[4.8], 'string':['d']}
df5 = DataFrame(data,columns=['float','string','int'],index = ['x','y','z'])
df2 = df2.append(df5)
删除行:
#删除行:么有pop,没有del
df2 = df2.drop('x')
print(df2.drop('x'))
其他操作:
data1 = {'int':[1,2,3,4,5],
'float':[1.2,3.1,3.5,2.2,6.3],
'string':['a','b','c','t','u'],
'int':[7,8,9,5,5],
'float':[1.2,3.1,3.5,3.5,3.2],}
df = DataFrame(data1)
print("df是:\n",df2)
df.head() #默认查看前5行
print("查看前5行:\n",df.head())
df.tail(3) #默认查看后5行
print("查看后5行:\n",df.tail(3) )
df.describe() #对数据进行快速总结
print("数据进行快速总结:\n",df.describe() )
df.T #转置数据
print("转置数据:\n",df.T )
############运行结果###########
df是:
float int int1 string
0 1.2 NaN NaN a
1 3.1 NaN NaN b
2 3.5 NaN NaN c
3 4.4 NaN NaN d
y 4.8 NaN 20.0 d
z 4.8 NaN 30.0 d
x 4.8 4.0 NaN d
y 4.8 4.0 NaN d
z 4.8 4.0 NaN d
查看前5行:
int float string
0 7 1.2 a
1 8 3.1 b
2 9 3.5 c
3 5 3.5 t
4 5 3.2 u
查看后5行:
int float string
2 9 3.5 c
3 5 3.5 t
4 5 3.2 u
数据进行快速总结:
int float
count 5.000000 5.000000
mean 6.800000 2.900000
std 1.788854 0.966954
min 5.000000 1.200000
25% 5.000000 3.100000
50% 7.000000 3.200000
75% 8.000000 3.500000
max 9.000000 3.500000
转置数据:
0 1 2 3 4
int 7 8 9 5 5
float 1.2 3.1 3.5 3.5 3.2
string a b c t u
统计方法:
df2.sum() #求和
df2.mean() #平均值
df3 = DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})
df4 = DataFrame({'a': [10, 20, 30], 'b': [40, 50, 60], 'c': [70, 80, 90]})
print("df3+df4的求和结果是:\n",df3+df4)
############运行结果###########
df3+df4的求和结果是:
a b c
0 11 44 77
1 22 55 88
2 33 66 99
4.文件读写
pandas:Excel
# 读取
xls = pd.ExcelFile('data_excel.xlsx')
df = xls.parse('data')
xls.parse()
print(df)
# 写入
df.to_excel('data_excel_out.xls',index=False,header=True)
pandas:CSV
# 读取csv,默认第一行为title
df_header = pd.read_csv('data_title.csv')
# 设定分隔符sep
df_header1 = pd.read_csv('data_cn副本.csv', sep=',', encoding='gbk')
fh = open('data_cn副本.csv')
df_title1 = pd.read_csv(fh)
print(df_title1)
# 读取无title的csv
df_noheader = pd.read_csv('data_notitle.csv', header=None)
# 添加列名
df_noheader1 = pd.read_csv('data_notitle.csv', names=['a', 'b', 'c', 'message'])
# 以某列值为索引
names = ['a', 'b', 'c', 'd', 'message']
df_noheader2 = pd.read_csv('data_notitle.csv', names=names, index_col='message')
# 以某列值为索引
names = ['a', 'b', 'c', 'd', 'message']
df_noheader2 = pd.read_csv('data_notitle.csv', names=names, index_col='message’)
# 读取不标准分隔符文件,可以用正则表达式进行匹配
df_blank = pd.read_csv('data_blank.csv', sep='\s+')
# 忽略N行,从第一行开始
df_blank1 = pd.read_csv('data_blank.csv', sep='\s+', skiprows=2)
# 忽略第N行,从0计数
df_blank1 = pd.read_csv('data_blank.csv', sep='\s+', skiprows=[2])
# 读取前N+1行
df_blank2 = pd.read_csv('data_blank.csv', sep='\s+', nrows=0)
df_out = pd.read_csv('data_out.csv’)
# 默认形式写入
df_out.to_csv('out_blask1.csv’)
# 设定分隔符及空值形式
df_out.to_csv('out_blank1.csv', sep='|', na_rep='NaN’)
#不写入head和index
df_out.to_csv('out_blank1.csv', sep='|', na_rep='NaN', header=False, index=False)
#追加模式
df_out.to_csv(mode='a')