零、参考
https://www.cnblogs.com/frchen/p/5725910.html
https://www.yiibai.com/pandas/python_pandas_data_structures.html
https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12282042.0.0.2f082042CwvpBz&postId=6068
一、常用导入
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
二、Series(系列)
Serise就是一维数据表, 是数据表的基本元素,常见创建方法为
s1=Series(data=[1,3,4,5],index=['a','b','c','d'])
print(s1)
print('s1.index: ',s1.index)
print('s1.values: ',s1.values)
三、DataFrame(数据帧)
DataFrame是数据的表单,二维数据表,它的构成为,index,columns,data,构成图大概是这样:
1、数据项(data)
(1)第一种常见的是字典创建,如:
data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]}
对于该字典直接创建则得到如下结果:
state year pop
0 Ohino 2000 1.5
1 Ohino 2001 1.7
2 Ohino 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
RangeIndex(start=0, stop=5, step=1)
Index(['state', 'year', 'pop'], dtype='object')
此时的index被自动复制为[0,5),而key值则作为columns,value则为data
更为全面的创建如下:
df = DataFrame(data,
index=['one','two','three','four','five'],
columns=['year','state','pop','debt'])
此时index和colunms都为自定义,此时的数据列数(即为一维数据长度)必须等于index长度,但是数据项缺失时(即二维数据长度,一维数据个数),则会自动用NaN补齐,此时字典的key值则被覆盖,结果如下
year state pop debt
one 2000 Ohino 1.5 NaN
two 2001 Ohino 1.7 NaN
three 2002 Ohino 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
Index(['year', 'state', 'pop', 'debt'], dtype='object')
(2)第二种常见的则是二维列表创建
数据项:
data = [['Ohino','Ohino','Ohino','Nevada','Nevada'],
[2000,2001,2002,2001,2002],
[1.5,1.7,3.6,2.4,2.9]]
结果为:
0 1 2 3 4
0 Ohino Ohino Ohino Nevada Nevada
1 2000 2001 2002 2001 2002
2 1.5 1.7 3.6 2.4 2.9
RangeIndex(start=0, stop=3, step=1)
RangeIndex(start=0, stop=5, step=1)
此时的index和colnumns都被自动赋值了
四、查询数据
原数据:
stu_dic = {
'Age':[14,13,13,14,14,12,12,15,13,12,11,14,12,15,16,12,15,11,15],
'Height':[69,56.5,65.3,62.8,63.5,57.3,59.8,62.5,62.5,59,51.3,64.3,56.3,66.5,72,64.8,67,57.5,66.5],
'Name':['Alfred','Alice','Barbara','Carol','Henry','James','Jane','Janet','Jeffrey','John','Joyce','Judy','Louise','Marry','Philip','Robert','Ronald','Thomas','Willam'],
'Sex':['M','F','F','F','M','M','F','F','M','M','F','F','F','F','M','M','M','M','M'],
'Weight':[112.5,84,98,102.5,102.5,83,84.5,112.5,84,99.5,50.5,90,77,112,150,128,133,85,112]}
student = pd.DataFrame(stu_dic)
DateFrame :
Age Height Name Sex Weight
0 14 69.0 Alfred M 112.5
1 13 56.5 Alice F 84.0
2 13 65.3 Barbara F 98.0
3 14 62.8 Carol F 102.5
4 14 63.5 Henry M 102.5
5 12 57.3 James M 83.0
6 12 59.8 Jane F 84.5
7 15 62.5 Janet F 112.5
8 13 62.5 Jeffrey M 84.0
9 12 59.0 John M 99.5
10 11 51.3 Joyce F 50.5
11 14 64.3 Judy F 90.0
12 12 56.3 Louise F 77.0
13 15 66.5 Marry F 112.0
14 16 72.0 Philip M 150.0
15 12 64.8 Robert M 128.0
16 15 67.0 Ronald M 133.0
17 11 57.5 Thomas M 85.0
18 15 66.5 Willam M 112.0
查询方法:与结果
print(student)#整表查询
Age Height Name Sex Weight
0 14 69.0 Alfred M 112.5
1 13 56.5 Alice F 84.0
2 13 65.3 Barbara F 98.0
3 14 62.8 Carol F 102.5
4 14 63.5 Henry M 102.5
5 12 57.3 James M 83.0
6 12 59.8 Jane F 84.5
7 15 62.5 Janet F 112.5
8 13 62.5 Jeffrey M 84.0
9 12 59.0 John M 99.5
10 11 51.3 Joyce F 50.5
11 14 64.3 Judy F 90.0
12 12 56.3 Louise F 77.0
13 15 66.5 Marry F 112.0
14 16 72.0 Philip M 150.0
15 12 64.8 Robert M 128.0
16 15 67.0 Ronald M 133.0
17 11 57.5 Thomas M 85.0
18 15 66.5 Willam M 112.0
print(student.head())#前五个
Age Height Name Sex Weight
0 14 69.0 Alfred M 112.5
1 13 56.5 Alice F 84.0
2 13 65.3 Barbara F 98.0
3 14 62.8 Carol F 102.5
4 14 63.5 Henry M 102.5
print(student.tail())#后五个
Age Height Name Sex Weight
14 16 72.0 Philip M 150.0
15 12 64.8 Robert M 128.0
16 15 67.0 Ronald M 133.0
17 11 57.5 Thomas M 85.0
18 15 66.5 Willam M 112.0
print(student.loc[[1,2,3]])#行查询
Age Height Name Sex Weight
1 13 56.5 Alice F 84.0
2 13 65.3 Barbara F 98.0
3 14 62.8 Carol F 102.5
print(student[['Name','Height']])#列查询
Name Height
0 Alfred 69.0
1 Alice 56.5
2 Barbara 65.3
3 Carol 62.8
4 Henry 63.5
5 James 57.3
6 Jane 59.8
7 Janet 62.5
8 Jeffrey 62.5
9 John 59.0
10 Joyce 51.3
11 Judy 64.3
12 Louise 56.3
13 Marry 66.5
14 Philip 72.0
15 Robert 64.8
16 Ronald 67.0
17 Thomas 57.5
18 Willam 66.5
print(student.loc[[2,4,5]][['Name','Sex']])#行列结合 行优先
print(student[['Name','Sex']].loc[[2,4,5]])#列优先
Name Sex
2 Barbara F
4 Henry M
5 James M
print(student[(student['Sex']=='F') & (student['Age']>12)])#筛选
Age Height Name Sex Weight
1 13 56.5 Alice F 84.0
6 12 59.8 Jane F 84.5
11 14 64.3 Judy F 90.0
12 12 56.3 Louise F 77.0
print(student[(student['Age']<=12) & (student['Height']>60)])
Age Height Name Sex Weight
15 12 64.8 Robert M 128.0
print(student[(student['Age']>=12) & (student['Weight']<=90) & (student['Sex']=='F')])
Age Height Name Sex Weight
1 13 56.5 Alice F 84.0
6 12 59.8 Jane F 84.5
11 14 64.3 Judy F 90.0
12 12 56.3 Louise F 77.0
五、统计分析
print('非空元素计算: ', d1.count()) #非空元素计算
print('最小值: ', d1.min()) #最小值
print('最大值: ', d1.max()) #最大值
print('最小值的位置: ', d1.idxmin()) #最小值的位置,类似于R中的which.min函数
print('最大值的位置: ', d1.idxmax()) #最大值的位置,类似于R中的which.max函数
print('10%分位数: ', d1.quantile(0.1)) #10%分位数
print('求和: ', d1.sum()) #求和
print('均值: ', d1.mean()) #均值
print('中位数: ', d1.median()) #中位数
print('众数: ', d1.mode()) #众数
print('方差: ', d1.var()) #方差
print('标准差: ', d1.std()) #标准差
print('平均绝对偏差: ', d1.mad()) #平均绝对偏差
print('偏度: ', d1.skew()) #偏度
print('峰度: ', d1.kurt()) #峰度
print('描述性统计指标: ', d1.describe()) #一次性输出多个描述性统计指标
必须注意的是,descirbe方法只能针对序列或数据框,一维数组是没有这个方法的
这里自定义一个函数,将这些统计描述指标全部汇总到一起:
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),
x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],
index = ['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max',
'Which_Max','Mad','Var','Std','Skew','Kurt'])
print(stats(d1))
Count 100.000000
Min -4.127033
Whicn_Min 81.000000
Q1 2.040101
Median 3.204555
Q3 4.434788
Mean 3.070225
Max 7.781921
Which_Max 39.000000
Mad 1.511288
Var 4.005609
Std 2.001402
Skew -0.649478
Kurt 1.220109
dtype: float64
在实际的工作中,我们可能需要处理的是一系列的数值型数据框,如何将这个函数应用到数据框中的每一列呢?可以使用apply函数,
这个非常类似于R中的apply的应用方法。 将之前创建的d1,d2,d3数据构建数据框:
df = pd.DataFrame(np.array([d1,d2,d3]).T,columns=['x1','x2','x3'])
print(df.head())
x1 x2 x3
0 3.942870 1.369531 55.0
1 0.618049 0.943264 68.0
2 5.865414 0.590663 73.0
3 2.374696 0.206548 59.0
4 1.558823 0.223204 60.0
print(df.apply(stats))
x1 x2 x3
Count 100.000000 100.000000 100.000000
Min -4.127033 0.014330 3.000000
Whicn_Min 81.000000 72.000000 76.000000
Q1 2.040101 0.249580 25.000000
Median 3.204555 1.000613 54.500000
Q3 4.434788 2.101581 73.000000
Mean 3.070225 2.028608 51.490000
Max 7.781921 18.791565 98.000000
Which_Max 39.000000 53.000000 96.000000
Mad 1.511288 1.922669 24.010800
Var 4.005609 10.206447 780.090808
Std 2.001402 3.194753 27.930106
Skew -0.649478 3.326246 -0.118917
Kurt 1.220109 12.636286 -1.211579
非常完美,就这样很简单的创建了数值型数据的统计性描述。如果是离散型数据呢?就不能用这个统计口径了,
我们需要统计离散变量的观测数、唯一值个数、众数水平及个数。你只需要使用describe方法就可以实现这样的统计了
print(student['Sex'].describe())
count 19
unique 2
top M
freq 10
Name: Sex, dtype: object
除以上的简单描述性统计之外,还提供了连续变量的相关系数(corr)和协方差矩阵(cov)的求解,这个跟R语言是一致的用法。
print(df.corr())
x1 x2 x3
x1 1.000000 0.136085 0.037185
x2 0.136085 1.000000 -0.005688
x3 0.037185 -0.005688 1.000000
关于相关系数的计算可以调用pearson方法或kendell方法或spearman方法,默认使用pearson方法。
print(df.corr('spearman'))
x1 x2 x3
x1 1.00000 0.178950 0.006590
x2 0.17895 1.000000 -0.033874
x3 0.00659 -0.033874 1.000000
如果只想关注某一个变量与其余变量的相关系数的话,可以使用corrwith,如下方只关心x1与其余变量的相关系数:
print(df.corrwith(df['x1']))
x1 1.000000
x2 0.136085
x3 0.037185
dtype: float64
数值型变量间的协方差矩阵
print(df.cov())
x1 x2 x3
x1 4.005609 0.870124 2.078596
x2 0.870124 10.206447 -0.507512
x3 2.078596 -0.507512 780.090808
六、增删改查
1、增
1)Series:
原表:
s1=Series(np.arange(5))
0 0
1 1
2 2
3 3
4 4
增加:
s1=s1.append(Series([7,8],index=[5,6]))
0 0
1 1
2 2
3 3
4 4
5 7
6 8
2)DataFrame
原表:
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
A B
0 1 2
1 3 4
增加行:
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
df=df.append(df2)
A B
0 1 2
1 3 4
0 5 6
1 7 8
df1 = pd.DataFrame(np.array([[1,2,3,4]]).T,columns=['A'])
df2 = pd.DataFrame(np.array([[5,6,7,8]]).T,columns=['A'])
df3 = pd.concat([df1,df2],axis=0)
A
0 1
1 2
2 3
3 4
0 5
1 6
2 7
3 8
增加列:
df1 = pd.DataFrame(np.array([[1,2,3,4]]).T,columns=['A'])
df2 = pd.DataFrame(np.array([[5,6,7,8]]).T,columns=['B'])
df3 = pd.concat([df1,df2],axis=1)
A B
0 1 5
1 2 6
2 3 7
3 4 8
df3['C']=[1,2,3,4]
A B C
0 1 5 1
1 2 6 2
2 3 7 3
3 4 8 4
2、删
1)Series:
s1=Series(np.arange(5))
s1=s1.drop([0,1],axis=0)#axis: 0行 1列
2 2
3 3
4 4
2)DataFrame:
删除行
df1 = pd.DataFrame(np.array([[1,2,3,4]]).T,columns=['A'])
df2 = pd.DataFrame(np.array([[5,6,7,8]]).T,columns=['A'])
df3 = pd.concat([df1,df2],axis=0)
A
0 1
1 2
2 3
3 4
0 5
1 6
2 7
3 8
df3 = df3.drop(0,axis=0)
A
1 2
2 3
3 4
1 6
2 7
3 8
删除列
df1 = pd.DataFrame(np.array([[1,2,3,4]]).T,columns=['A'])
df2 = pd.DataFrame(np.array([[5,6,7,8]]).T,columns=['B'])
df3 = pd.concat([df1,df2],axis=1)
A B
0 1 5
1 2 6
2 3 7
3 4 8
df3 = df3.drop('B',axis=1)
A
0 1
1 2
2 3
3 4
3、改
DataFrame的改动即为增添删除的重新赋值即可
4、查
查在第四大节以叙述,不在重复