Pandas基础

零、参考

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、查

查在第四大节以叙述,不在重复

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值