python--Pandas
Posted eilinge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python--Pandas相关的知识,希望对你有一定的参考价值。
一、Pandas简介
1、Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。
pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
2、Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。
Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。
panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
3、数据结构:
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
Time- Series:以时间为索引的Series。
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
Panel :三维的数组,可以理解为DataFrame的容器。
Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。
只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。
pandas 基本使用
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
s = pd.Series([1,3,5,np.nan,6,8])
‘‘‘
>>> s
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
‘‘‘
dates = pd.date_range(‘20180330‘,periods=6)
‘‘‘
DatetimeIndex([‘2018-03-30‘, ‘2018-03-31‘, ‘2018-04-01‘, ‘2018-04-02‘,
‘2018-04-03‘, ‘2018-04-04‘],
dtype=‘datetime64[ns]‘, freq=‘D‘)
‘‘‘
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list(‘ABCD‘))
‘‘‘
A B C D
2018-03-30 1.421753 -0.835878 1.077365 0.407735
2018-03-31 -0.608609 -1.148211 -1.174397 0.108209
2018-04-01 -0.635743 1.759105 0.375025 1.558345
2018-04-02 0.829423 1.506339 0.858323 0.867596
2018-04-03 0.443178 -1.083932 -0.179227 -0.485547
2018-04-04 -0.913496 0.320855 -0.940977 0.877651
‘‘‘
df2 = pd.DataFrame({
‘A‘:1,
‘B‘:pd.Timestamp(‘20130102‘),
‘C‘:pd.Series(1,index=list(range(4)),dtype=‘float32‘),
‘D‘:np.array([3]*4,dtype=‘int32‘),
‘E‘:pd.Categorical([‘test‘,‘train‘,‘test‘,‘train‘]),
‘F‘:‘foo‘})
‘‘‘
A B C D E F
0 1 2013-01-02 1.0 3 test foo
1 1 2013-01-02 1.0 3 train foo
2 1 2013-01-02 1.0 3 test foo
3 1 2013-01-02 1.0 3 train foo
‘‘‘
print(df2.dtypes)
‘‘‘
A int64
B datetime64[ns]
C float32
D int32
E category
F object
dtype: object
‘‘‘
‘‘‘
>>> df2.head(2) #显示前面2行
A B C D E F
0 1 2013-01-02 1.0 3 test foo
1 1 2013-01-02 1.0 3 train foo
>>> df2.tail(2) #显示后面2行
A B C D E F
2 1 2013-01-02 1.0 3 test foo
3 1 2013-01-02 1.0 3 train foo
>>> df.index
DatetimeIndex([‘2018-03-30‘, ‘2018-03-31‘, ‘2018-04-01‘, ‘2018-04-02‘,
‘2018-04-03‘, ‘2018-04-04‘],
dtype=‘datetime64[ns]‘, freq=‘D‘)
>>> df.columns
Index([‘A‘, ‘B‘, ‘C‘, ‘D‘], dtype=‘object‘)
>>> df.values
array([[-0.7399801 , 0.63228899, -0.19250377, 1.13034102],
[-1.62267282, 0.26772863, 0.14344581, 0.69354685],
[-1.08605314, -1.02026368, -0.22525268, 1.3305295 ],
[ 0.75133965, -1.15389799, -0.60457632, 1.93324854],
[-1.07516695, -0.52292111, 2.5930546 , -0.69028129],
[ 0.56341006, 0.73365219, 0.52632723, 0.85383304]])
>>> df.describe() #快速计算出数据的统计描述
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.534854 -0.177235 0.373416 0.875203
std 0.967643 0.832719 1.152233 0.880463
min -1.622673 -1.153898 -0.604576 -0.690281
25% -1.083332 -0.895928 -0.217065 0.733618
50% -0.907574 -0.127596 -0.024529 0.992087
75% 0.237563 0.541149 0.430607 1.280482
max 0.751340 0.733652 2.593055 1.933249
>>> df.T #对数据进行转置
2018-03-30 2018-03-31 2018-04-01 2018-04-02 2018-04-03 2018-04-04
A -0.739980 -1.622673 -1.086053 0.751340 -1.075167 0.563410
B 0.632289 0.267729 -1.020264 -1.153898 -0.522921 0.733652
C -0.192504 0.143446 -0.225253 -0.604576 2.593055 0.526327
D 1.130341 0.693547 1.330529 1.933249 -0.690281 0.853833
>>> df
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281
2018-04-04 0.563410 0.733652 0.526327 0.853833
>>> df.sort_index(axis=1,ascending=False) #.sort_index索引排序
D C B A
2018-03-30 1.130341 -0.192504 0.632289 -0.739980
2018-03-31 0.693547 0.143446 0.267729 -1.622673
2018-04-01 1.330529 -0.225253 -1.020264 -1.086053
2018-04-02 1.933249 -0.604576 -1.153898 0.751340
2018-04-03 -0.690281 2.593055 -0.522921 -1.075167
2018-04-04 0.853833 0.526327 0.733652 0.563410
>>> df.sort_index(axis=1,ascending=True)
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281
2018-04-04 0.563410 0.733652 0.526327 0.853833
>>> df.sort_index(axis=0,ascending=False)
A B C D
2018-04-04 0.563410 0.733652 0.526327 0.853833
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
>>> df.sort_values(by=‘A‘) #对A列进行排序
A B C D
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-04-04 0.563410 0.733652 0.526327 0.853833
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
#选择 Selection
>>> df[‘A‘] /df.A #提取A列
2018-03-30 -0.739980
2018-03-31 -1.622673
2018-04-01 -1.086053
2018-04-02 0.751340
2018-04-03 -1.075167
2018-04-04 0.563410
Freq: D, Name: A, dtype: float64
>>> df[0:3] #提取0-2列
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
>>> df[‘2018-03-30‘:‘2018-04-02‘] #根据条件进行选取
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
#根据标签进行选择
>>> df.loc[dates[0]] #提取第一行数据,将List作为索引,去除index
A -0.739980
B 0.632289
C -0.192504
D 1.130341
Name: 2018-03-30 00:00:00, dtype: float64
>>> df.loc[:,[‘A‘,‘B‘]] #提取A,B列数据
A B
2018-03-30 -0.739980 0.632289
2018-03-31 -1.622673 0.267729
2018-04-01 -1.086053 -1.020264
2018-04-02 0.751340 -1.153898
2018-04-03 -1.075167 -0.522921
2018-04-04 0.563410 0.733652
>>> df.loc[‘20180330‘:‘20180402‘] #=df[‘2018-03-30‘:‘2018-04-02‘]
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
>>> df.loc[‘20180330‘,[‘A‘,‘C‘]] #提取20180330行的A,C数据
A -0.739980
C -0.192504
Name: 2018-03-30 00:00:00, dtype: float64
>>> df.loc[dates[0],‘A‘] #提取第一行的A数据 ==.at
-0.73998009901277373
>>> df.at[dates[0],‘A‘]
-0.73998009901277373
#根据位置获取 LOC通过标签‘20180330‘,‘A‘获取数据,iloc通过行号0-5,列号0-4进行获取
>>> df.iloc[3] #获取第四行数据
A 0.751340
B -1.153898
C -0.604576
D 1.933249
Name: 2018-04-02 00:00:00, dtype: float64
>>> df.iloc[3:5,0:2] #获取第4,5行,第1,2列数据
A B
2018-04-02 0.751340 -1.153898
2018-04-03 -1.075167 -0.522921
>>> df.iloc[[1,2,3],[0,2]]
A C
2018-03-31 -1.622673 0.143446
2018-04-01 -1.086053 -0.225253
2018-04-02 0.751340 -0.604576
>>> df.iloc[1:3,:]
A B C D
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
>>> df.iloc[:,1:3]
B C
2018-03-30 0.632289 -0.192504
2018-03-31 0.267729 0.143446
2018-04-01 -1.020264 -0.225253
2018-04-02 -1.153898 -0.604576
2018-04-03 -0.522921 2.593055
2018-04-04 0.733652 0.526327
>>> df.iloc[1,2] #快速获取一个值 ==.iat
0.14344580950869434
>>> df.iat[1,2]
0.14344580950869434
#布尔索引
利用一列的数据选择一部分数据
>>> df
A B C D
2018-03-30 -0.739980 0.632289 -0.192504 1.130341
2018-03-31 -1.622673 0.267729 0.143446 0.693547
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529
2018-04-02 0.751340 -1.153898 -0.604576 1.933249
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281
2018-04-04 0.563410 0.733652 0.526327 0.853833
>>> df[df.A>0] #获取df.A>0的行
A B C D
2018-04-02 0.75134 -1.153898 -0.604576 1.933249
2018-04-04 0.56341 0.733652 0.526327 0.853833
>>> df[df>0] #获取全部>0的值,小于0的数据使用NaN代替
A B C D
2018-03-30 NaN 0.632289 NaN 1.130341
2018-03-31 NaN 0.267729 0.143446 0.693547
2018-04-01 NaN NaN NaN 1.330529
2018-04-02 0.75134 NaN NaN 1.933249
2018-04-03 NaN NaN 2.593055 NaN
2018-04-04 0.56341 0.733652 0.526327 0.853833
>>> df3=df.copy()
>>> df3[‘E‘]= [‘one‘,‘ine‘,‘two‘,‘three‘,‘four‘,‘tw1‘] #添加新的列:==字典添加
>>> df3
A B C D E
2018-03-30 -0.739980 0.632289 -0.192504 1.130341 one
2018-03-31 -1.622673 0.267729 0.143446 0.693547 ine
2018-04-01 -1.086053 -1.020264 -0.225253 1.330529 two
2018-04-02 0.751340 -1.153898 -0.604576 1.933249 three
2018-04-03 -1.075167 -0.522921 2.593055 -0.690281 four
2018-04-04 0.563410 0.733652 0.526327 0.853833 tw1
‘‘‘
s1 = pd.Series([1,2,3,4,5,6],index=pd.date_range(‘20180330‘,periods=6))
‘‘‘
>>> df[‘F‘]=s1
>>> df
A B C D F
2018-03-30 -1.211269 -0.230951 0.043337 -0.009419 1
2018-03-31 0.777628 -1.073505 -0.020837 -1.536191 2
2018-04-01 -0.796874 0.683661 -0.674022 1.692808 3
2018-04-02 0.175397 -0.388439 0.282642 -0.896609 4
2018-04-03 -0.465964 -0.763797 -0.816209 0.062528 5
2018-04-04 0.967350 -1.416464 -0.547718 -0.034147 6
>>> s1
2013-03-30 1
2013-03-31 2
2013-04-01 3
2013-04-02 4
2013-04-03 5
2013-04-04 6
Freq: D, dtype: int64
>>> df[‘F‘]=s1 #插入的时候,需要使index保持一致
>>> df
A B C D F
2018-03-30 -0.031562 1.484402 1.793304 0.853730 NaN
2018-03-31 0.281454 0.121194 -0.141079 0.739159 NaN
2018-04-01 1.920370 0.637906 0.786430 0.344235 NaN
2018-04-02 1.558576 -1.547453 -2.212035 -0.853297 NaN
2018-04-03 1.603768 -0.273412 -1.106593 -0.597859 NaN
2018-04-04 -1.745511 1.979249 -0.015600 0.991435 NaN
>>> df.at[dates[0],‘A‘] = 0 #at使用标签赋值
>>> df
A B C D F
2018-03-30 0.000000 -0.230951 0.043337 -0.009419 1
2018-03-31 0.777628 -1.073505 -0.020837 -1.536191 2
2018-04-01 -0.796874 0.683661 -0.674022 1.692808 3
2018-04-02 0.175397 -0.388439 0.282642 -0.896609 4
2018-04-03 -0.465964 -0.763797 -0.816209 0.062528 5
2018-04-04 0.967350 -1.416464 -0.547718 -0.034147 6
>>> df.iat[0,0] =1 #iat使用坐标进行赋值
>>> df
A B C D F
2018-03-30 1.000000 -0.230951 0.043337 -0.009419 1
2018-03-31 0.777628 -1.073505 -0.020837 -1.536191 2
2018-04-01 -0.796874 0.683661 -0.674022 1.692808 3
2018-04-02 0.175397 -0.388439 0.282642 -0.896609 4
2018-04-03 -0.465964 -0.763797 -0.816209 0.062528 5
2018-04-04 0.967350 -1.416464 -0.547718 -0.034147 6
>>> df.loc[:,‘D‘]= np.array([5]*len(df)) #使用np进行赋值
>>> df
A B C D F
2018-03-30 1.000000 -0.230951 0.043337 5 1
2018-03-31 0.777628 -1.073505 -0.020837 5 2
2018-04-01 -0.796874 0.683661 -0.674022 5 3
2018-04-02 0.175397 -0.388439 0.282642 5 4
2018-04-03 -0.465964 -0.763797 -0.816209 5 5
2018-04-04 0.967350 -1.416464 -0.547718 5 6
>>> -df
A B C D F
2018-03-30 -1.000000 0.230951 -0.043337 -5.0 -1.0
2018-03-31 -0.777628 1.073505 0.020837 -5.0 -2.0
2018-04-01 0.796874 -0.683661 0.674022 -5.0 -3.0
2018-04-02 -0.175397 0.388439 -0.282642 -5.0 -4.0
2018-04-03 0.465964 0.763797 0.816209 -5.0 -5.0
2018-04-04 -0.967350 1.416464 0.547718 -5.0 -6.0
>>> df4 = df.copy()
>>> df4[df4>0] = -df4 #将df4数据全部变负值
>>> df4
A B C D F
2018-03-30 -1.000000 -0.230951 -0.043337 -5 -1
2018-03-31 -0.777628 -1.073505 -0.020837 -5 -2
2018-04-01 -0.796874 -0.683661 -0.674022 -5 -3
2018-04-02 -0.175397 -0.388439 -0.282642 -5 -4
2018-04-03 -0.465964 -0.763797 -0.816209 -5 -5
2018-04-04 -0.967350 -1.416464 -0.547718 -5 -6
‘‘‘
#df.to_csv(‘123.txt‘) #会自己创建文件,如果文件存在,则覆盖
#df.to_excel(‘345.xlsx‘)
print(‘写入成功‘)
df5 = pd.read_csv(‘123.txt‘)
df6 = pd.read_excel(‘345.xlsx‘)
print(df6)
以上是关于python--Pandas的主要内容,如果未能解决你的问题,请参考以下文章
Python:通过以更特定于 Pandas 的方式编写代码来简化代码