学习机器学习,最基本的就是用Python语言对数据进行基本操作,面对众多需要学习的知识,基本上学完就忘了,贼难受啦!!这不我本着我下地狱的精神,总结了一下,但愿众生别放弃,哈哈。
pandas
先来个整体目录感受一下:
创建
- 通过创建Series
- 通过传递numpy array创建元素
- 通过字典的结构进行创建,
查看数据
- 查看数据类型(.dtypes)
- 查看数据前或后几行数据(.head(),tail())
- 显示索引(.index 就是每一行的id,可以标识每一行的唯一值)
- 显示列名(.columns)
- 只显示数据(.values,即不显示列名)
提取数据(这部分容易乱,有点过分)
标签提取数据和位置选择数据(标签可以理解为行名和列名)
提取某一列:(df['列名']),df.loc[:,'列名'],df.iloc[:,a]
提取多列:(df[['列名1',列名2',列名3']]),df.loc[:,['列名','列名2']],df.iloc[:,a:b]
提取某个单行数据:df.loc[a,:],(df.iloc[a],a为行数,且返回的数据类型为series),
提取某几行:(df[a:b])df.loc[a:b,:],df.iloc[a:b,:]。注意容易出错的地方:用行标签来指定输出时df['20180704']会出错,但df['20180704':'20180705']不会,
提取局部数据:(df.loc['20180705':'20180706',['列名1','列名2']]或者df.iloc[a:b,c:d])或者提取列和行不连续的数据:(df.iloc[[a,c],[a,d]])
提取数据中的单个数据:(df.loc[index[0],'列名1'])或者df.at[index[0],'列名1'],at是专门用于获取某个值的,,或者df.iloc[2,2]取第3行第3列的数据,或者df.iat[2,2],iat[]也是专门用于获取单个值的方法,
总结:
[]用于提取列时,不支持切片取多行列,[a:b]只对行进行切片,也就是[]只支持一维的操作,.loc[]:不仅支持一维的操作,也支持二维的操作,支持切片操作,但范围有限。iloc[]主要的特点就是进行切片操作,不支持标签操作,支持一维和二维的操作,at[],是.loc[]特殊方法.iat[]是.ilo[]c的特殊方法,这两者对应的功能是取单个值,只是效率高。
代码实现:
创建对象:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
'''
(1)创建对象
'''
"""******创建的数据的框的第一种方法*******"""
#创建series,这个将数据框的单个列拿出来后的,数据类型就是series
a = pd.Series([1,3,4,5,np.NaN,7,4,3])#注意空值的写法
print("series类型数据")
print(a)#默认数据类型
#创建连续的时间序列和内置的range()相似
dates = pd.date_range('20180701',periods=8)
#创建一个数据框,注意index控制行名,columns控制列名
#常见的产生随机数的数函数,np.random.rand,np.random.randint,np.random.randn
df = pd.DataFrame(np.random.randn(8,7),index=dates,columns=list('abcdefg'))
print("第一种创建方法结果")
print(df)
"""******创建的数据的框的第二种方法*******"""
#这种方法,依次以字典的形式创建,键就是列名,值就是数据,而行名,一般会自动生成
df2 = pd.DataFrame({'a':[5.,6,9,33],
'b':np.array([4]*4,dtype='int64'),
'c':'ha',#写一个值会默认填充,所有的行,写两个值会出错,会提示维度必须和其他一致
'd':['python','c','java','c#']})
#pd提供了很多生成数据的函数,如
#pd.Timestamp,pd.Series,pd.Categorical等用好这些函数可以产生一些特殊的值
print("第二种创建方法结果")
print(df2)
结果:
series类型数据
0 1.0
1 3.0
2 4.0
3 5.0
4 NaN
5 7.0
6 4.0
7 3.0
dtype: float64
第一种创建方法结果
a b c ... e f g
2018-07-01 0.474164 -0.298453 0.762399 ... -0.832252 -0.829000 -0.525417
2018-07-02 0.597638 0.031861 0.293669 ... -1.495900 0.655275 -0.657688
2018-07-03 -0.941270 -0.010800 2.059281 ... 0.205073 1.788395 0.306779
2018-07-04 0.658773 -0.304058 -0.818325 ... -0.496420 0.135895 1.302388
2018-07-05 -0.009313 0.519114 0.090704 ... 0.199784 0.524973 1.057487
2018-07-06 0.697587 1.012932 -1.662217 ... -1.306278 -0.465362 -0.649750
2018-07-07 -0.019078 -1.474736 1.877737 ... -0.479318 -1.357733 1.844780
2018-07-08 0.083440 -1.863479 -0.068155 ... -0.341920 -0.662433 -0.802808
[8 rows x 7 columns]
第二种创建方法结果
a b c d
0 5.0 4 ha python
1 6.0 4 ha c
2 9.0 4 ha java
3 33.0 4 ha c#
查看数据:
#查看df的数据类型和df2的数据类型
print("打印df数据类型")
print(df.dtypes)
print("打印df2数据类型")
print(df2.dtypes)
#打印数据
print("打印df数据前5行数据")
print(df.head())#默认显示前5行数据
print("打印df数据前3行数据")
print(df.head(3))#可以指定显示的行数
print("打印df数据后3行数据")
print(df.tail())#默认显示后5行数据
#显示行名,专业一点叫索引
print("打印df行名")
print(df.index)
print("打印df2行名")
print(df2.index)#这个索引没有设置,默认从0开始
#查看数据框列名
print("打印df列名名")
print(df.columns)
print("打印df2的列名")
print(df2.columns)
#查看数据框数据
print("打印df数据")
print(df.values) #只显示数据,不显示列名,和行名
结果:
打印df数据类型
a float64
b float64
c float64
d float64
e float64
f float64
g float64
dtype: object
打印df2数据类型
a float64
b int64
c object
d object
dtype: object
打印df数据前5行数据
a b c ... e f g
2018-07-01 0.474164 -0.298453 0.762399 ... -0.832252 -0.829000 -0.525417
2018-07-02 0.597638 0.031861 0.293669 ... -1.495900 0.655275 -0.657688
2018-07-03 -0.941270 -0.010800 2.059281 ... 0.205073 1.788395 0.306779
2018-07-04 0.658773 -0.304058 -0.818325 ... -0.496420 0.135895 1.302388
2018-07-05 -0.009313 0.519114 0.090704 ... 0.199784 0.524973 1.057487
[5 rows x 7 columns]
打印df数据前3行数据
a b c ... e f g
2018-07-01 0.474164 -0.298453 0.762399 ... -0.832252 -0.829000 -0.525417
2018-07-02 0.597638 0.031861 0.293669 ... -1.495900 0.655275 -0.657688
2018-07-03 -0.941270 -0.010800 2.059281 ... 0.205073 1.788395 0.306779
[3 rows x 7 columns]
打印df数据后3行数据
a b c ... e f g
2018-07-04 0.658773 -0.304058 -0.818325 ... -0.496420 0.135895 1.302388
2018-07-05 -0.009313 0.519114 0.090704 ... 0.199784 0.524973 1.057487
2018-07-06 0.697587 1.012932 -1.662217 ... -1.306278 -0.465362 -0.649750
2018-07-07 -0.019078 -1.474736 1.877737 ... -0.479318 -1.357733 1.844780
2018-07-08 0.083440 -1.863479 -0.068155 ... -0.341920 -0.662433 -0.802808
[5 rows x 7 columns]
打印df行名
DatetimeIndex(['2018-07-01', '2018-07-02', '2018-07-03', '2018-07-04',
'2018-07-05', '2018-07-06', '2018-07-07', '2018-07-08'],
dtype='datetime64[ns]', freq='D')
打印df2行名
RangeIndex(start=0, stop=4, step=1)
打印df列名名
Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object')
打印df2的列名
Index(['a', 'b', 'c', 'd'], dtype='object')
打印df数据
[[ 0.4741637 -0.29845338 0.76239901 1.12766539 -0.8322525 -0.82899974
-0.52541728]
[ 0.59763817 0.03186107 0.29366898 0.8881474 -1.49589993 0.65527546
-0.65768787]
[-0.94127016 -0.01080037 2.05928147 0.57408647 0.20507309 1.78839482
0.30677869]
[ 0.65877338 -0.30405806 -0.81832471 0.63417451 -0.49642033 0.13589513
1.30238769]
[-0.0093132 0.51911421 0.09070427 0.21256695 0.19978357 0.5249733
1.05748712]
[ 0.69758747 1.01293207 -1.66221737 1.51007092 -1.30627825 -0.46536231
-0.6497497 ]
[-0.01907807 -1.47473584 1.8777374 1.03489133 -0.47931771 -1.35773347
1.84478003]
[ 0.08344046 -1.863479 -0.06815489 -0.22271602 -0.34192 -0.66243283
-0.80280836]]
提取数据
提取某一列
#提取某一列
print("提取df2某一列")
print("[]方法")
a = df2['a']
print(a)
print("df2.loc[]方法")
print(df2.loc[:,'a'])#这两个方法打印的形式不同
print("df2.iloc[]方法")
print(df2.iloc[:,0])
结果:
提取df2某一列
[]方法
0 5.0
1 6.0
2 9.0
3 33.0
Name: a, dtype: float64
df2.loc[]方法
0 5.0
1 6.0
2 9.0
3 33.0
Name: a, dtype: float64
df2.iloc[]方法
0 5.0
1 6.0
2 9.0
3 33.0
Name: a, dtype: float64
提取多列:
#提取多列
print("[]方法")
print(df2[['a','b','c']])
print("df2.loc[]方法")
print(df2.loc[:,['a','b','c']])
print("df2.iloc[]方法")
print(df2.iloc[:,0:3])#注意不包括3,
结果:
[]方法
a b c
0 5.0 4 ha
1 6.0 4 ha
2 9.0 4 ha
3 33.0 4 ha
df2.loc[]方法
a b c
0 5.0 4 ha
1 6.0 4 ha
2 9.0 4 ha
3 33.0 4 ha
df2.iloc[]方法
a b c
0 5.0 4 ha
1 6.0 4 ha
2 9.0 4 ha
3 33.0 4 ha
提取单行:
#提取某一行
print("df2.iloc[]")
print(df2.iloc[2])
print("df2.loc[],")
print(df2.loc[2,:])
结果:
#提取某一行
print("df2.iloc[]")
print(df2.iloc[2])
print("df2.loc[],")
print(df2.loc[2,:])
提取多行:
#提取多行
print("[]方法")
print(df2[0:2])#输出两行
print("在[]中用标签来指定行")
print(df['20180704':'20180705'])
print("df2.loc[]方法")
print(df2.loc[0:2,:])
print("df2.iloc[]方法")
print(df2.iloc[0:2,:])
结果:
[]方法
a b c d
0 5.0 4 ha python
1 6.0 4 ha c
在[]中用标签来指定行
a b c ... e f g
2018-07-04 0.658773 -0.304058 -0.818325 ... -0.496420 0.135895 1.302388
2018-07-05 -0.009313 0.519114 0.090704 ... 0.199784 0.524973 1.057487
[2 rows x 7 columns]
df2.loc[]方法
a b c d
0 5.0 4 ha python
1 6.0 4 ha c
2 9.0 4 ha java
df2.iloc[]方法
a b c d
0 5.0 4 ha python
1 6.0 4 ha c
提取单个数据
#提取单个数据
print("df.iloc[]方法")
print(df.iloc[1,1])#提取单个数据
print("df.iat[]方法")
print(df.iat[1,1])
print("df.loc[]方法")
print(df.loc[dates[1],'b'])
print("df.at[]方法")
print(df.at[dates[1],'b'])
结果:
df.iloc[]方法
0.03186106541551168
df.iat[]方法
0.03186106541551168
df.loc[]方法
0.03186106541551168
df.at[]方法
0.03186106541551168
提取局部数据
#提取局部数据
print("df.loc方法")
print(df.loc['20180704':'20180705',['a','b']])
print("df.iloc方法")
print(df.iloc[3:5,0:2])#注意最后一个数字不包括
#或者可以提取列和行不连续的数据
print("提取行或列不连续的数据")
print(df.iloc[[0,2],[1,3]])
#df.loc[['20180704','20180706'],['b','d']]会报错
结果:
df.loc方法
a b
2018-07-04 0.658773 -0.304058
2018-07-05 -0.009313 0.519114
df.iloc方法
a b
2018-07-04 0.658773 -0.304058
2018-07-05 -0.009313 0.519114
提取行或列不连续的数据
b d
2018-07-01 -0.298453 1.127665
2018-07-03 -0.010800 0.574086