我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!
Python是数据分析领域极受喜爱的主流程序语言。这里主要介绍Pandas
的常用用法。如果你是从事数据分析、或者人工智能等相关领域,而所用的语言又是Python的话,以下知识点都应该 “张口就来” 。建议收藏,有事没事拿出来看两遍。
Pandas
在pandas中主要进行的操作有:数据创建、数据查看、数据选择、数据设置、缺失值处理、汇总与统计、类SQL操作、时间序列、文件I/O等。
在Pandas中主要有Series
、Dataframe
、Panel
三种数据结构。
Series
主要处理一维数组,带有标签作为索引;DataFrame
中主要处理二维数组,与SQL的表结构类似。可以理解成Series为value的Map数据结构。Panel
主要处理三维数组,可以理解成DataFrame为Value的Map数据结构。
在使用之前我们需要先导入一些包和库:
import numpy as np
import pandas as pd
- 创建
Series
对象:
1. 传入list
创建Series
,并生成默认的整形索引:
s = pd.Series([1,4,3,4,5])
其结果如下所示:
0 1
1 4
2 3
3 4
4 5
dtype: int64
2. 指定索引创建Series
:
s = pd.Series([1,4,3,4,5],index=['a','b','c','d','e'])
其结果如下所示:
a 1
b 4
c 3
d 4
e 5
dtype: int64
3. 传入Numpy的ndarray数组创建:
s = pd.Series(np.arange(0,10,2))
其结果如下所示:
0 0
1 2
2 4
3 6
4 8
dtype: int32
- 创建
DataFrame
对象:
1. 基本创建方式:
dates = pd.date_range('20170101', periods=5)
print(dates)
df = pd.DataFrame(np.random.randn(5, 4), index=dates, columns=list('ABCD'))
print(df)
其结果如下所示:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05'],
dtype='datetime64[ns]', freq='D')
A B C D
2017-01-01 -0.321335 1.587721 0.299199 0.767145
2017-01-02 1.260628 -0.706693 0.134149 0.640150
2017-01-03 -0.509672 0.478142 -0.979709 -0.425294
2017-01-04 -0.873157 1.294672 0.293942 0.086441
2017-01-05 -0.057205 -0.324212 -0.036619 -2.004187
2. 传入Python的dict创建DataFrame数组:
df = pd.DataFrame({'a':1, 'b':2, 'c':3, 'd':('d1','d2','d3')})
print(df)
其结果如下所示:
a b c d
0 1 2 3 d1
1 1 2 3 d2
2 1 2 3 d3
- 数据查看:
1. head()
函数:
用Pandas读取数据之后,我们往往想要观察一下数据读取是否准确,这就要用到Pandas里面的head( )
函数,这也就是用head( )
函数只能读取前五行数据的原因。
s = pd.Series([5,4,3,2,1,0])
print(s.head())
其结果如下所示:
0 5
1 4
2 3
3 2
4 1
dtype: int64
如果你需要看6行的数据的话,可以使用以下方式:
s = pd.Series([5,4,3,2,1,0])
print(s.head(6))
其结果如下所示:
0 5
1 4
2 3
3 2
4 1
5 0
dtype: int64
2. tail()
函数:
如果我们想要查看后五行的数据的话,可以使用tail
函数。
s = pd.Series([5,4,3,2,1,0])
print(s.tail())
其结果如下所示:
1 4
2 3
3 2
4 1
5 0
dtype: int64
3. 通过index
、columns
、values
查看df
数据:
a. index:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.index)
其结果如下所示:
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
b. columns:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.columns)
其结果如下所示:
Index(['item1', 'item2', 'item3'], dtype='object')
c.values:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.values)
其结果如下所示:
[[ 0.36103977 -0.41744764 0.73185252]
[-1.32653494 -0.44633907 0.77793686]
[-0.22452797 -0.26831592 0.84475079]
[ 2.12886463 -0.7417558 1.25928745]
[ 0.75119873 -0.39850574 -0.73147078]]
4. 行列互换:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.T)
其结果如下所示:
a b c d e
item1 -0.003415 1.485351 0.900848 -0.652781 1.513073
item2 -1.193721 1.458872 1.145293 0.697140 0.865924
item3 0.375283 0.373512 -0.479490 0.899247 0.828550
5. df
排序查看:
由sort_index()
函数控制,参数axis
表示行还是列,ascending
表示是否升序:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.sort_index(axis=0, ascending=False))
其结果如下所示:
item1 item2 item3
e -0.436986 -0.257037 -0.456523
d 0.450501 1.353554 -0.380524
c -0.762128 0.995587 0.595866
b 0.555154 -0.505319 1.608678
a -1.354116 -1.136033 2.239606
- 数据选择:
1. 获取列:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df['item1'])
其结果如下所示:
a 0.926735
b -0.962309
c -0.595314
d -1.104773
e 0.653732
Name: item1, dtype: float64
2. 获取行:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df[0:1])
其结果如下所示:
item1 item2 item3
a -0.682284 0.175816 0.008739
3. 通过索引获取数据:
通过loc[name]
获取数据:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.loc['a'])
其结果如下所示:
item1 -0.236757
item2 -1.379234
item3 -2.199539i
Name: a, dtype: float64
4. 通过位置获取数据:
通过iloc[local num]
获取数据:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.iloc[2])
其结果如下所示:
item1 -0.292156
item2 1.818376
item3 -0.758109
Name: c, dtype: float64
5. 获取指定的单个数据:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.iat[1,1])
其结果如下所示:
0.1357562784012159
- 数据设置:
- 设置单个值:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
df.iat[1,1]=10
print(df)
其结果如下所示:
item1 item2 item3
a -0.819400 -0.398266 0.173521
b -0.860223 10.000000 0.321826
c -0.544537 -0.266417 0.869232
d -0.109308 0.082432 1.685385
e -0.267699 1.172023 0.203023
- 设置一个序列:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
df['item1']=[1, 2, 3, 4, 5]
print(df)
其结果如下所示:
item1 item2 item3
a 1 -0.473974 -0.988442
b 2 2.122583 -1.353341
c 3 -0.339094 1.108518
d 4 0.066525 -0.714947
e 5 0.160430 -1.140654
- 缺失值处理:
1. 去除带有Nan
空值的行:
df.dropna(how='any')
2. 填补Nan
空值:
df.fillna(value=0.1234)
3. 获取控制布尔值掩码:
pd.isnull(df)
- 汇总与统计:
我们首先需要创建一个dataframe:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df)
打印出来的结果是:
>>> item1 item2 item3
a 0.286680 -0.107453 1.598851
b -1.005839 0.496943 0.137294
c -1.291884 0.097849 -2.080798
d -0.459137 -0.604159 0.703430
e -0.983638 0.649630 -0.584021
之后我们看看一些信息描述:
df = pd.DataFrame(np.random.randn(5,3), index=['a','b','c','d','e'], columns=['item1','item2','item3'])
print(df.describe())
结果显示如下所示:
>>> item1 item2 item3
count 5.000000 5.000000 5.000000
mean 0.264230 -0.325748 -0.259222
std 0.505316 0.840482 1.129705
min -0.499806 -1.455938 -1.166522
25% 0.005952 -0.995604 -0.959291
50% 0.504441 0.186685 -0.478101
75% 0.594557 0.254665 -0.364955
max 0.716006 0.381454 1.672759
- 时间序列:
时间序列基于Timestamp
和DatetimeIndex
,以及Period
和PeriodIndex
进行操作。其主要用途是作为Series
或者DataFrame
的索引,并进行一系列的时间序列相关操作。下面我们首先通过示例,对Timestamp和Period的数据形式做直观的展示,再接着说明如何生成以及应用该时间序列作为索引:
1. 创建Timestamp:
print(pd.Timestamp('2019-01-01'))
结果显示如下所示:
2019-01-01 00:00:00
或者:
print(pd.Timestamp(pd.datetime(2019,1,1)))
结果显示如下所示:
2019-01-01 00:00:00
2. DatatimeIndex索引生成:
DatatimeIndex
索引生成的三种方式,pd.datatime(2019,1,1)
,pd.date_range('2019-1-1', periods=3, freq='D')
,data_range
生成的是日历时间,bdate_range('2017-1-1', periods=10)
生成的是工作日时间。
- 文件I/O:
pandas
提供了一系列简单易用的文件I/O函数,可以把Series
以及DataFrame
的数据以多种形式保存到文件,并从文件读取到内存中。可以保存的形式包括:csv
、hdf
、excel
、json
、html
、sql
、stata
、sas
、clipboard
、pickle
。这里简要介绍一下csv
,excel
的操作方式。
csv
文件的存读:
df = pd.DataFrame(np.random.randn(4,3), index=['r1', 'r2', 'r3', 'r4'], columns=list('abc'))
df.to_csv('df.csv')
print(pd.read_csv('df.csv'))
结果显示如下所示:
Unnamed: 0 a b c
0 r1 0.094285 -0.875614 -0.261379
1 r2 -2.113989 -0.099856 0.989506
2 r3 -0.465270 0.140364 0.946633
3 r4 -0.344263 -0.542004 0.116143
excel
文件的存读:
df = pd.DataFrame(np.random.randn(4,3), index=['r1', 'r2', 'r3', 'r4'], columns=list('abc'))
df.to_excel('df.xlsx', sheet_name='Sheet1')
print(pd.read_excel('df.xlsx', 'Sheet1', index_col=None))
结果显示如下所示:
Unnamed: 0 a b c
0 r1 0.165704 0.757834 -0.727770
1 r2 -1.260624 0.028085 -0.211497
2 r3 -0.692826 -1.263691 -1.582624
3 r4 -0.741005 -0.035819 0.163536