10 Minutes to pandas

来源:互联网 发布:淘宝网开店收费吗 编辑:程序博客网 时间:2024/06/06 10:39

导入方式

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt

一.创建对象

传递一个列表,创建一个Series,默认索引为整型

s=pd.Series([1,3,5,np.nan,6,8])sOut[5]: 0    1.01    3.02    5.03    NaN4    6.05    8.0dtype: float64

创建时间索引

In [7]: dates=pd.date_range('20170721',periods=6)#6 个索引值In [8]: datesOut[8]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24',               '2017-07-25', '2017-07-26'],              dtype='datetime64[ns]', freq='D')

指定行列索引,创建DataFrame

In [9]: df=pd.DataFrame(np.random.randn(6,4),index=dates,columns['A','B','C','D'])In [10]: dfOut[10]:                    A         B         C         D2017-07-21 -1.525652  0.122387 -1.259828 -1.2924502017-07-22  0.390645  0.829519 -1.397772  0.4386152017-07-23  0.875678 -1.159174  0.255005 -1.3157992017-07-24 -1.754487  1.285334  0.755246  0.5098242017-07-25 -0.787207  2.083840  0.135200  0.4493182017-07-26 -1.036861 -0.546105 -0.580360 -0.042891

传递一个Series的字典,可以指定列索引,行索引与原Series一样

df=pd.DataFrame(s,columns=['a'])dfOut[20]:      a0  1.01  3.02  5.03  NaN4  6.05  8.0

传递一个能够被转换成类似Series的字典来创建一个DataFrame,字典的每一个元素都被看成一个series,key即为列索引,长度不一致可以广播

df2=pd.DataFrame({ 'A':1,                   'B':pd.Timestamp('20170721') ,                    'C':pd.Series([1,2,3,4],index=['z','x','c','s'])})df2Out[43]:    A          B  Cz  1 2017-07-21  1x  1 2017-07-21  2c  1 2017-07-21  3s  1 2017-07-21  4

查看数据类型

df2.dtypesOut[44]: A             int64B    datetime64[ns]C             int64dtype: object

二.查看数据

查看头部5行和尾部5行

In [48]: df.head()Out[48]:                    A         B         C         D2017-07-21  0.888811 -0.039728  0.660442 -1.0569132017-07-22  1.267505 -0.044836  1.275167  1.0351132017-07-23  0.125988 -1.829078  1.053110  0.0745282017-07-24 -0.139170 -0.704593  0.208797  0.2681832017-07-25  0.800954  0.002910  1.212054  1.790770In [49]: df.tail()Out[49]:                    A         B         C         D2017-07-22  1.267505 -0.044836  1.275167  1.0351132017-07-23  0.125988 -1.829078  1.053110  0.0745282017-07-24 -0.139170 -0.704593  0.208797  0.2681832017-07-25  0.800954  0.002910  1.212054  1.7907702017-07-26  0.786291 -1.065658 -0.751298 -0.591745

显示索引和数据

In [50]: df.indexOut[50]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24',               '2017-07-25', '2017-07-26'],              dtype='datetime64[ns]', freq='D')In [51]: df.columnsOut[51]: Index([u'A', u'B', u'C', u'D'], dtype='object')In [52]: df.valuesOut[52]: array([[ 0.88881115, -0.0397281 ,  0.66044235, -1.05691294],       [ 1.26750516, -0.04483592,  1.27516665,  1.03511314],       [ 0.12598841, -1.82907844,  1.05311   ,  0.07452816],       [-0.13917035, -0.7045935 ,  0.20879703,  0.26818348],       [ 0.80095357,  0.00290982,  1.21205356,  1.79076959],       [ 0.78629106, -1.06565763, -0.75129755, -0.591745  ]])

describe()函数 ,每一列数据的快速统计

In [53]: df.describe()Out[53]:               A         B         C         Dcount  6.000000  6.000000  6.000000  6.000000mean   0.621730 -0.613497  0.609712  0.253323std    0.523887  0.737961  0.776904  1.042879min   -0.139170 -1.829078 -0.751298 -1.05691325%    0.291064 -0.975392  0.321708 -0.42517750%    0.793622 -0.374715  0.856776  0.17135675%    0.866847 -0.041005  1.172318  0.843381max    1.267505  0.002910  1.275167  1.790770

转置行列,注意df的结构还是没有变,df1是转置后的结构

df1=df.T
In [55]: df.TOut[55]:    2017-07-21  2017-07-22  2017-07-23  2017-07-24  2017-07-25  2017-07-26A    0.888811    1.267505    0.125988   -0.139170    0.800954    0.786291B   -0.039728   -0.044836   -1.829078   -0.704593    0.002910   -1.065658C    0.660442    1.275167    1.053110    0.208797    1.212054   -0.751298D   -1.056913    1.035113    0.074528    0.268183    1.790770   -0.591745

按轴排序,按照轴的索引值排序,但是排序后依然不变,需赋值才可以使用

df.sort_index(axis=1, ascending=False)

按值进行排序,by='某个列索引',按照这个索引的数据从小排序

df.sort_values(by='A')

若想用行索引,可以先转置为 df1=df.T
好像直接by='某个行索引'不行啊

In [72]: df1.sort_values(by='2017-07-22')Out[72]:    2017-07-21  2017-07-22  2017-07-23  2017-07-24  2017-07-25  2017-07-26B   -0.039728   -0.044836   -1.829078   -0.704593    0.002910   -1.065658D   -1.056913    1.035113    0.074528    0.268183    1.790770   -0.591745A    0.888811    1.267505    0.125988   -0.139170    0.800954    0.786291C    0.660442    1.275167    1.053110    0.208797    1.212054   -0.751298

三.选择

获取(不太方便认为)

选择一列,返回Series,df[‘A’],同df.A
只能访问一个,不能多个,也不能切片

In [73]: df['A']Out[73]: 2017-07-21    0.8888112017-07-22    1.2675052017-07-23    0.1259882017-07-24   -0.1391702017-07-25    0.8009542017-07-26    0.786291Freq: D, Name: A, dtype: float64In [74]: df.A

通过[ ]进行选择,行的切片
可以是索引也可以是标号,但只是按行
通过索引标签的话,包括首位
但是通过数字标号的话,不包括尾,看例子。

df['20170722':'20170724']Out[77]:                    A         B         C         D2017-07-22  1.267505 -0.044836  1.275167  1.0351132017-07-23  0.125988 -1.829078  1.053110  0.0745282017-07-24 -0.139170 -0.704593  0.208797  0.268183df[0:3]Out[75]:                    A         B         C         D2017-07-21  0.888811 -0.039728  0.660442 -1.0569132017-07-22  1.267505 -0.044836  1.275167  1.0351132017-07-23  0.125988 -1.829078  1.053110  0.074528

通过标签选择(方便灵活多样推荐)

使用标签来获取一个交叉的区域(注意标签切片包括尾部,后面的数字切片不包括)

In [88]: datesOut[88]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24',               '2017-07-25', '2017-07-26'],              dtype='datetime64[ns]', freq='D')In [89]: dates[0]Out[89]: Timestamp('2017-07-21 00:00:00', offset='D')

df.loc[dates[0]]df.loc['2017-07-21']

In [91]: df.loc[dates[0]]Out[91]: A    0.888811B   -0.039728C    0.660442D   -1.056913Name: 2017-07-21 00:00:00, dtype: float64

还可以类似numpy数组的方式切片,也可以单个,不同的是这个切片包括尾部
切片 a:b 包括b,不同的是a b为索引标签,不是整数

In [97]: df.loc[:dates[1],['A','B']]Out[97]:                    A         B2017-07-21  0.888811 -0.0397282017-07-22  1.267505 -0.044836In [98]: df.loc[:'2017-07-24',['A','B']]Out[98]:                    A         B2017-07-21  0.888811 -0.0397282017-07-22  1.267505 -0.0448362017-07-23  0.125988 -1.8290782017-07-24 -0.139170 -0.704593

还会进行自动维度缩减,但是还有name参数

In [110]: df.loc[dates[1],['A','B']]Out[110]: A    1.267505B   -0.044836Name: 2017-07-22 00:00:00, dtype: float64

若获取某一个标量,有快速方法

df.at[dates[0],'A']#快速df.loc[dates[0],'A']#两个返回内容等价

通过位置选择

通过数值
选择行

In [111]: df.iloc[3]

通过整数的切片,也可以是列表,总之与numpy相同,切片一般不包括尾部

df.iloc[3:5,0:2]df.iloc[[1,2,4],[0,2]]

快速的访问标量方法

df.iat[1,1]

布尔索引

使用一列来选择数据

df[df.A > 0]

对于所有的,则不满足的为NaN

In [114]: df[df > 0]Out[114]:                    A        B         C         D2017-07-21  0.888811      NaN  0.660442       NaN2017-07-22  1.267505      NaN  1.275167  1.0351132017-07-23  0.125988      NaN  1.053110  0.0745282017-07-24       NaN      NaN  0.208797  0.2681832017-07-25  0.800954  0.00291  1.212054  1.7907702017-07-26  0.786291      NaN       NaN       NaN

使用isin()方法来过滤
先复制再添加一列

In [116]: df2 = df.copy()In [117]: df2['E'] = ['one', 'one','two','three','four','three']In [118]: df2Out[118]:                    A         B         C         D      E2017-07-21  0.888811 -0.039728  0.660442 -1.056913    one2017-07-22  1.267505 -0.044836  1.275167  1.035113    one2017-07-23  0.125988 -1.829078  1.053110  0.074528    two2017-07-24 -0.139170 -0.704593  0.208797  0.268183  three2017-07-25  0.800954  0.002910  1.212054  1.790770   four2017-07-26  0.786291 -1.065658 -0.751298 -0.591745  three

设置

设置一个新的列,自动排列日期索引

s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1

通过标签更改某个值

df.at[dates[0],'A'] = 0df.iat[0,1] = 0

获取行数len()

len(df)Out[147]: 6

通过一个numpy数组设置一组新值

df.loc[:,'D'] = np.array([1,2,3,5,4,5])dfOut[149]:                    A         B         C  D    F2017-07-21  0.888811 -0.039728  0.660442  1  NaN2017-07-22  1.267505 -0.044836  1.275167  2  1.02017-07-23  0.125988 -1.829078  1.053110  3  2.02017-07-24 -0.139170 -0.704593  0.208797  5  3.02017-07-25  0.800954  0.002910  1.212054  4  4.02017-07-26  0.786291 -1.065658 -0.751298  5  5.0

通过where操作来设置新的值

df2 = df.copy()df2[df2 > 0] = -df2

四.缺失值处理

重新索引允许改变,增加,删除具体轴上的索引。返回原始数据的拷贝。
缺失为NaN

In [169]: df1 = df.reindex(index=dates[0:5], columns=list(df.columns) + ['E'])In [170]: df1Out[170]:                    A         B         C  D    F   E2017-07-21  0.888811 -0.039728  0.660442  1  NaN NaN2017-07-22  1.267505 -0.044836  1.275167  2  1.0 NaN2017-07-23  0.125988 -1.829078  1.053110  3  2.0 NaN2017-07-24 -0.139170 -0.704593  0.208797  5  3.0 NaN2017-07-25  0.800954  0.002910  1.212054  4  4.0 NaN

去掉包含Nan的行

df1.dropna(how='any')

填充所有的Nan

df1.fillna(value=5)

以布尔值填充

In [176]: pd.isnull(df1)Out[176]:                 A      B      C      D      F      E2017-07-21  False  False  False  False   True   True2017-07-22  False  False  False  False  False   True2017-07-23  False  False  False  False  False   True2017-07-24  False  False  False  False  False   True2017-07-25  False  False  False  False  False  False

五.相关操作

统计

一般不包括NaN
执行描述性统计,默认按0轴操作

In [178]: df.mean()Out[178]: A    0.621730B   -0.613497C    0.609712D    3.333333F    3.000000dtype: float64

在其他轴操作,按行求均值

In [179]: df.mean(1)Out[179]: 2017-07-21    0.6273812017-07-22    1.0995672017-07-23    0.8700042017-07-24    1.4730072017-07-25    2.0031832017-07-26    1.793867Freq: D, dtype: float64

对于一些算数操作,可以广播,如下,第0轴的减法。

df.sub(s, axis=0)Out[188]:                    A         B         C    D    F2017-07-21 -0.111189 -1.039728 -0.339558  0.0  NaN2017-07-22 -1.732495 -3.044836 -1.724833 -1.0 -2.02017-07-23 -4.874012 -6.829078 -3.946890 -2.0 -3.02017-07-24       NaN       NaN       NaN  NaN  NaN2017-07-25 -5.199046 -5.997090 -4.787946 -2.0 -2.02017-07-26 -7.213709 -9.065658 -8.751298 -3.0 -3.0

Apply

直方图

字符串方法

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog','cat'])In [201]: s.str.lower()Out[201]: 0       a1       b2       c3    aaba4    baca5     NaN6    caba7     dog8     catdtype: object

保存文件

df.to_csv('路径',encoding='gbk')df=pd.read_csv('路径',encoding='gbk')