[Pandas 学习笔记] - No.1 pandas学习笔记

pandas学习笔记

pandas是基于numpy开发出的数据分析包,用于高效地操作大型数据集。pandas的数据结构有三种 分别为 series,dataframe和panel,对应一维,二维,三维数据。 其中datafram最为常用,我们仅对dataframe进行记录。

dataframe其实就是一个形似数据库中的table一样的数据结构,我们可以从列表,字典,series和numpy ndarray和 dataframe创建df;同时还可以从csv文件来读入数据创建df

在这里插入图片描述

# pandas中的DataFrame可以使用以下构造函数创建 
pandas.DataFrame( data, index, columns, dtype, copy)
编号 参数 描述
1 data 数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame
2 index 行标签,默认是从0开始的整数
3 columns 列表千年,即字段名,默认是从0开始的整数
4 dtype 每一列的数据类型
5 copy 如果默认值为False,则此命令(或任何它)用于复制数据

pandas数据表创建

import pandas as pd
import numpy as np

# 使用列表列表(列表的元素是一个列表)来创建df
data = [['Alex',12],['Bob',15],['Jack',18]]
df = pd.DataFrame(data)
print (df)

'''
      0   1
0  Alex  12
1   Bob  15
2  Jack  18
'''

由结果可知,如果我们不添加列名的话,默认是从0开始标记列名,这里我们指明列名,数据类型。另外,我们还可以设置特殊的index

data = [['Alex',12],['Bob',15],['Jack',18]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype='float')
print (df)

'''
  Name   Age
0  Alex  12.0
1   Bob  15.0
2  Jack  18.0
'''

#  我们还可以使用字典列表来创建一个df,从而不用设置columns
data = [{'Name': 'Alex', 'Age': 12},{'Name': 'Bob', 'Age': 15},{'Name': 'Jack', 'Age': 18,'Phone':'521366'}]
df = pd.DataFrame(data)
print(df)

'''
  Age  Name   Phone
0   12  Alex     NaN
1   15   Bob     NaN
2   18  Jack  521366
'''

我们会发现,使用字典列表的方式来创建,如果有的字典中缺少某个字段 那么会自动填充NaN
上述的方法都是由一个list来创建dataframe,list中每个元素代表一行的数据;

我们还可以使用字典 创建整列数据

data = {'Name':['Alex','Bob','Jack'],'Age':[12,15,18]}
df = pd.DataFrame(data,index=['rank1','rank2','rank3'])
print(df)

'''
       Age  Name
rank1   12  Alex
rank2   15   Bob
rank3   18  Jack
'''

除此之外,我们还可以使用numpy和读取csv数据的方式创建dataframe

# 使用numpy生成dataframe
import numpy as np
data = np.random.randn(5,5)

df = pd.DataFrame(data,columns=['A','B','C','D','E'])
print(df)

'''
          A         B         C         D         E
0 -0.372475  0.450400  0.742329 -1.037012 -0.902100
1  0.696321 -1.055079 -2.263853  0.941368  0.376098
2  0.721607 -0.178860  0.413946 -0.509012 -0.297089
3  0.498155 -1.236906  0.216542 -1.110133 -1.033379
4 -1.199099 -1.613378 -0.370484 -0.354009  0.125048
'''

#从csv文件读取数据 添加到df
df = pd.read_csv("titanic.csv", header=0)
print(df.head(10)) #打印前十行,结果太多不再展示

pandas 数据表筛选,查询排序

pandas的排序主要有两种排序:

  • 对index进行排序(包括对行index排序和列index排序)
  • 对某一列值进行排序:(基于某一列的值交换行)
# index排序
unsort_df = pd.DataFrame(np.arange(25).reshape(5,5),index = [4,0,2,1,3],columns=['B','A','E','C','D'])
print(unsort_df)

'''
    B   A   E   C   D
4   0   1   2   3   4
0   5   6   7   8   9
2  10  11  12  13  14
1  15  16  17  18  19
3  20  21  22  23  24
'''

对行index进行排序:

sort_df = unsort_df.sort_index(axis=0,ascending=True) # 按照升序排列
print(sort_df)

'''
    B   A   E   C   D
0   5   6   7   8   9
1  15  16  17  18  19
2  10  11  12  13  14
3  20  21  22  23  24
4   0   1   2   3   4
'''

对列标签进行排序:

sort_df = unsort_df.sort_index(axis=1)
print(sort_df)

'''
   A   B   C   D   E
4   1   0   3   4   2
0   6   5   8   9   7
2  11  10  13  14  12
1  16  15  18  19  17
3  21  20  23  24  22
'''

对某一列的值进行排序:

# 对某一列的值进行排序
unsort_df = pd.DataFrame(np.random.rand(5,5),columns=['A','B','C','D','E'])
print(unsort_df)

'''
         A         B         C         D         E
0  0.064110  0.261228  0.407898  0.442963  0.543346
1  0.108448  0.860408  0.127829  0.081763  0.122567
2  0.102532  0.575612  0.406204  0.343808  0.787604
3  0.336907  0.315543  0.880459  0.981245  0.074163
4  0.806219  0.922854  0.649067  0.335794  0.271572
'''

sort_df = unsort_df.sort_values(by='A',kind='mergesort') # 对第一列A进行排序,默认为升序
print(sort_df)

'''
         A         B         C         D         E
0  0.303920  0.558314  0.767881  0.172027  0.635556
3  0.404746  0.834687  0.695462  0.747880  0.258342
2  0.409437  0.427695  0.217155  0.041271  0.572030
4  0.599488  0.592189  0.812071  0.284848  0.767630
1  0.864761  0.123731  0.807521  0.071350  0.356040
'''

在上面的排序函数 sort_values()中,有by和kind两个字段;by设置需要排序的列,kind设置所使用的排序算法。一共有三种算法:mergesortheapsortquicksort;推荐使用mergesort算法

pandas索引

dataframe的索引中,有三个函数可以用于选择数据

  • loc(): 使用index来选择数据 (based indexing)
  • iloc():使用整数索引来选择数据 (positional indexing)
  • ix(): iloc()和loc()的混合 (已废弃,不推荐使用)

我们分别使用上面的三种索引,来选择行数据,列数据:

使用loc():

df = pd.DataFrame(np.random.rand(5,5),columns=['A','B','C','D','E'],index=['r1','r2','r3','r4','r5'])
print(df)

'''
         A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r2  0.195108  0.688970  0.756126  0.065059  0.565333
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''

#获取列数据
# 获取指定单列
print(df.loc[:,'A']) 

'''
r1    0.560104
r2    0.762691
r3    0.517329
r4    0.976693
r5    0.859421
Name: A, dtype: float64
'''
#获取指定列 多列
print(df.loc[:,['C','E']]) # 获取 'C','E'两列
'''
        C         E
r1  0.835193  0.025310
r2  0.927207  0.647369
r3  0.165869  0.081265
r4  0.455334  0.322755
r5  0.417843  0.629403
'''
print(df.loc[:,'C':'E'])   # 获取 'C','D','E'三列 
'''
         C         D         E
r1  0.835193  0.082388  0.025310
r2  0.927207  0.806717  0.647369
r3  0.165869  0.046043  0.081265
r4  0.455334  0.916932  0.322755
r5  0.417843  0.015367  0.629403
'''

# 获取行数据
# 获取'r2' 行
print(df.loc['r2',:])
'''
A    0.762691
B    0.895068
C    0.927207
D    0.806717
E    0.647369
Name: r2, dtype: float64
'''

# 获取'r2','r3','r4' 三行
print(df.loc['r2':'r4',:]) #获取行 r2-r4
'''
         A         B         C         D         E
r2  0.762691  0.895068  0.927207  0.806717  0.647369
r3  0.517329  0.267965  0.165869  0.046043  0.081265
r4  0.976693  0.365548  0.455334  0.916932  0.322755
'''

# 获取'r2','r4'两行
print(df.loc[['r2','r4'],:]) #获取行 r2,r4
'''
         A         B         C         D         E
r2  0.762691  0.895068  0.927207  0.806717  0.647369
r4  0.976693  0.365548  0.455334  0.916932  0.322755
'''

另外,在我们进行索引的时候,就像python中的切片一样,如果是针对行的索引,那么后边的,: 是可以省略不写的。

iloc():

# iloc方法 使用整数切片(数字为具体的行号)
#  获取指定行

print(df)

'''
           A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r2  0.195108  0.688970  0.756126  0.065059  0.565333
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''

print(df.iloc[2]) # 获取第三行
'''
A    0.365706
B    0.648914
C    0.579140
D    0.660109
E    0.054941
Name: r3, dtype: float64
'''

print(df.iloc[2:4]) #  获取第三,第四行
'''
           A         B         C         D         E
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r4  0.406658  0.449347  0.772691  0.600538  0.144391
'''
print(df.iloc[[0,2,4],:]) #获取0,2,4三行
'''
            A         B         C         D         E
r1  0.319453  0.719874  0.836147  0.977027  0.796801
r3  0.365706  0.648914  0.579140  0.660109  0.054941
r5  0.489836  0.647537  0.034738  0.051654  0.826314
'''

#获取列数据
# 获取指定列 结果不再展示
print(df.iloc[:,2]) #获取第三列
print(df.iloc[:,2:5]) #获取第三,第四列
print(df.iloc[:,[0,2,4]]) #获取0,2,4三列

ix():

# ix方法
print(df.ix[0:3,['A','B','E']])
'''
           A         B         E
r1  0.319453  0.719874  0.796801
r2  0.195108  0.688970  0.565333
r3  0.365706  0.648914  0.054941
'''

ix()方法是上述两个方法的结合,即既可以使用数字,也可以使用标签。但是pandas中不再推荐使用

pandas 对数据表进行操作

在操作中,最简单的就是对数据进行增删:

df = pd.DataFrame(np.random.rand(3,3),columns=['A','B','C'],index=['r1','r2','r3'])
print(df)
'''
           A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
'''

# 增删列 
# 如果想要仅仅在最后添加一列,,方法如下
df['new_col1'] = None
print(df)
'''
           A         B         C new_col1
r1  0.653356  0.960060  0.552862     None
r2  0.774473  0.272467  0.147769     None
r3  0.049872  0.943801  0.965931     None
'''

df['new_col2'] = 0.5
print(df)
'''
           A         B         C new_col1  new_col2
r1  0.653356  0.960060  0.552862     None       0.5
r2  0.774473  0.272467  0.147769     None       0.5
r3  0.049872  0.943801  0.965931     None       0.5
'''

# 删除列
df.drop(['new_col1','new_col2'],axis=1,inplace=True)
print(df)
'''
           A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
'''

如果想增加多列,方法如下:

# 在最后添加多列:
df2 = pd.DataFrame(np.random.randn(3,2),columns = ['add1','add2'],index=['r1','r2','r3'])
print(df2)
'''
        add1      add2
r1  2.050387  0.471776
r2  0.804328 -0.562791
r3  1.140708 -1.477404
'''

df3 = pd.DataFrame(np.random.randn(2,3),columns = ['A','B','C'])
print(df3)
'''
          A         B         C
0 -0.729599  0.154387 -0.325885
1  0.378690  0.204472 -0.374436
'''

new_df = pd.concat([df,df2],axis=1)
print(new_df)
'''
           A         B         C      add1      add2
r1  0.653356  0.960060  0.552862  2.050387  0.471776
r2  0.774473  0.272467  0.147769  0.804328 -0.562791
r3  0.049872  0.943801  0.965931  1.140708 -1.477404
'''

pd.concat()用于连接dataframe,其中axis属性代表拼接方向;如果axis=0代表沿行方向拼接,axis=1代表沿列方向拼接

# 沿行方向拼接df
new_df = pd.concat([df,df3],axis=0)
print(new_df)
'''
           A         B         C
r1  0.653356  0.960060  0.552862
r2  0.774473  0.272467  0.147769
r3  0.049872  0.943801  0.965931
0  -0.729599  0.154387 -0.325885
1   0.378690  0.204472 -0.374436
'''
# 按照标签删除行 
new_df.drop(['r1','r3'], axis=0,inplace=True)
print(new_df)
'''
           A         B         C
r2  0.774473  0.272467  0.147769
0  -0.729599  0.154387 -0.325885
1   0.378690  0.204472 -0.374436
'''

#增加一个新的行
new_df = new_df.append(pd.Series([0,1,2],index=['A','B','C']),ignore_index=True)
print(new_df)
'''
         A         B         C
0  0.774473  0.272467  0.147769
1 -0.729599  0.154387 -0.325885
2  0.378690  0.204472 -0.374436
3  0.000000  1.000000  2.000000
'''

dataframe 提供了一系列函数对数据进行统计分析:

df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])
print(df)

'''
          a         b         c         d         e
0 -0.123195  0.904182  1.954444 -0.161568 -1.452412
1  0.020782 -0.816824  0.676511  1.370532  0.883918
2 -1.196381  2.156407  1.325780 -0.107228 -0.060447
3 -1.413799 -0.882798  0.284797  0.731573  0.210051
4 -0.170625 -1.391171 -0.139347  1.059765  1.102944
5 -1.207354 -0.893137  0.928643  0.070762  1.007776
6  0.603928 -2.299983  2.158155  0.127855  0.011646
7 -0.735168 -1.144970 -0.815661 -0.112566 -0.942321
8  1.582841 -1.520188 -0.463830  1.045699 -0.064077
9 -1.341750 -0.022456 -1.641289  1.708361 -0.501614
'''

列之间协方差:

# 列与列之间的协方差
print(df.cov())
print("\na,e协方差:{}\n".format(df['a'].cov(df['e'])))
'''
         a         b         c         d         e
a  0.950983 -0.602311  0.195242  0.075699 -0.009229
b -0.602311  1.673961  0.269066 -0.231610 -0.389904
c  0.195242  0.269066  1.489807 -0.530289  0.009390
d  0.075699 -0.231610 -0.530289  0.481481  0.213109
e -0.009229 -0.389904  0.009390  0.213109  0.701188

a,e协方差:-0.009229160115646852

'''

列之间相关性:

# 列与列相关性:
print (df.corr())
print("\na,e相关性:{}\n".format(df['a'].corr(df['e'])))
'''
          a         b         c         d         e
a  1.000000 -0.477377  0.164029  0.111870 -0.011302
b -0.477377  1.000000  0.170381 -0.257986 -0.359889
c  0.164029  0.170381  1.000000 -0.626121  0.009187
d  0.111870 -0.257986 -0.626121  1.000000  0.366771
e -0.011302 -0.359889  0.009187  0.366771  1.000000

a,e相关性:-0.011302084979431462
'''

一些简单统计指标,结果不再展示:

# 某一列 和,最大值,最小值,均值,方差
print(df['a'].sum())
print(df['a'].max())
print(df['a'].min())
print(df['a'].mean())
print(df['a'].var())

pandas数据查询:

dataframe还可以像SQL一样进行查询使用

# 首先创建一个数据表
data_dict = {'Name':['Alex','Bob','Conan','Jakc'],
             'Age':[22,25,26,23],
             'Salary':[2100,2300,2500,4100],
             'Department':['Sale','Tech','Sale','Support']}
df = pd.DataFrame(data_dict,columns=['Name','Age','Salary','Department'])
print(df)
'''
    Name  Age  Salary Department
0   Alex   22    2100       Sale
1    Bob   25    2300       Tech
2  Conan   26    2500       Sale
3   Jakc   23    4100    Support
'''

# 查看公司所有人员 姓名及年龄
print(df[['Name','Age']])
'''
    Name  Age
0   Alex   22
1    Bob   25
2  Conan   26
3   Jakc   23
'''

# 查看年龄大于等于25的人员名单
print(df[df['Age']>=25])  #类似numpy中的布尔索引获取值
'''
    Name  Age  Salary Department
1    Bob   25    2300       Tech
2  Conan   26    2500       Sale
'''

#获取工资前两名的员工信息
print(df.sort_values('Salary',ascending=False).head(2))
'''
    Name  Age  Salary Department
3   Jakc   23    4100    Support
2  Conan   26    2500       Sale
'''

#获取每个部门的平均工资
print(df.groupby('Department')['Salary'].mean())

'''
Department
Sale       2300
Support    4100
Tech       2300
Name: Salary, dtype: int64
'''
发布了118 篇原创文章 · 获赞 140 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/tjuyanming/article/details/88598306