您的位置:首页 > 其它

10 Minutes to pandas

2017-07-21 11:48 381 查看
导入方式

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt


一.创建对象

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

s=pd.Series([1,3,5,np.nan,6,8])

s
Out[5]:
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0
dtype: float64


创建时间索引

In [7]: dates=pd.date_range('20170721',periods=6)#6 个索引值

In [8]: dates
Out[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]: df
Out[10]:
A         B         C         D
2017-07-21 -1.525652  0.122387 -1.259828 -1.292450
2017-07-22  0.390645  0.829519 -1.397772  0.438615
2017-07-23  0.875678 -1.159174  0.255005 -1.315799
2017-07-24 -1.754487  1.285334  0.755246  0.509824
2017-07-25 -0.787207  2.083840  0.135200  0.449318
2017-07-26 -1.036861 -0.546105 -0.580360 -0.042891


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

df=pd.DataFrame(s,columns=['a'])

df
Out[20]:
a
0  1.0
1  3.0
2  5.0
3  NaN
4  6.0
5  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'])
})

df2
Out[43]:
A          B  C
z  1 2017-07-21  1
x  1 2017-07-21  2
c  1 2017-07-21  3
s  1 2017-07-21  4


查看数据类型

df2.dtypes
Out[44]:
A             int64
B    datetime64[ns]
C             int64
dtype: object


二.查看数据

查看头部5行和尾部5行

In [48]: df.head()
Out[48]:
A         B         C         D
2017-07-21  0.888811 -0.039728  0.660442 -1.056913
2017-07-22  1.267505 -0.044836  1.275167  1.035113
2017-07-23  0.125988 -1.829078  1.053110  0.074528
2017-07-24 -0.139170 -0.704593  0.208797  0.268183
2017-07-25  0.800954  0.002910  1.212054  1.790770

In [49]: df.tail()
Out[49]:
A         B         C         D
2017-07-22  1.267505 -0.044836  1.275167  1.035113
2017-07-23  0.125988 -1.829078  1.053110  0.074528
2017-07-24 -0.139170 -0.704593  0.208797  0.268183
2017-07-25  0.800954  0.002910  1.212054  1.790770
2017-07-26  0.786291 -1.065658 -0.751298 -0.591745


显示索引和数据

In [50]: df.index
Out[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.columns
Out[51]: Index([u'A', u'B', u'C', u'D'], dtype='object')

In [52]: df.values
Out[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         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.621730 -0.613497  0.609712  0.253323
std    0.523887  0.737961  0.776904  1.042879
min   -0.139170 -1.829078 -0.751298 -1.056913
25%    0.291064 -0.975392  0.321708 -0.425177
50%    0.793622 -0.374715  0.856776  0.171356
75%    0.866847 -0.041005  1.172318  0.843381
max    1.267505  0.002910  1.275167  1.790770


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

df1=df.T


In [55]: df.T
Out[55]:
2017-07-21  2017-07-22  2017-07-23  2017-07-24  2017-07-25  2017-07-26
A    0.888811    1.267505    0.125988   -0.139170    0.800954    0.786291
B   -0.039728   -0.044836   -1.829078   -0.704593    0.002910   -1.065658
C    0.660442    1.275167    1.053110    0.208797    1.212054   -0.751298
D   -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-26
B   -0.039728   -0.044836   -1.829078   -0.704593    0.002910   -1.065658
D   -1.056913    1.035113    0.074528    0.268183    1.790770   -0.591745
A    0.888811    1.267505    0.125988   -0.139170    0.800954    0.786291
C    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.888811
2017-07-22    1.267505
2017-07-23    0.125988
2017-07-24   -0.139170
2017-07-25    0.800954
2017-07-26    0.786291
Freq: D, Name: A, dtype: float64

In [74]: df.A


通过[ ]进行选择,行的切片

可以是索引也可以是标号,但只是按行

通过索引标签的话,包括首位

但是通过数字标号的话,不包括尾,看例子。

df['20170722':'20170724']
Out[77]:
A         B         C         D
2017-07-22  1.267505 -0.044836  1.275167  1.035113
2017-07-23  0.125988 -1.829078  1.053110  0.074528
2017-07-24 -0.139170 -0.704593  0.208797  0.268183

df[0:3]
Out[75]:
A         B         C         D
2017-07-21  0.888811 -0.039728  0.660442 -1.056913
2017-07-22  1.267505 -0.044836  1.275167  1.035113
2017-07-23  0.125988 -1.829078  1.053110  0.074528


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

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


In [88]: dates
Out[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.888811
B   -0.039728
C    0.660442
D   -1.056913
Name: 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         B
2017-07-21  0.888811 -0.039728
2017-07-22  1.267505 -0.044836

In [98]: df.loc[:'2017-07-24',['A','B']]
Out[98]:
A         B
2017-07-21  0.888811 -0.039728
2017-07-22  1.267505 -0.044836
2017-07-23  0.125988 -1.829078
2017-07-24 -0.139170 -0.704593


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

In [110]: df.loc[dates[1],['A','B']]
Out[110]:
A    1.267505
B   -0.044836
Name: 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         D
2017-07-21  0.888811      NaN  0.660442       NaN
2017-07-22  1.267505      NaN  1.275167  1.035113
2017-07-23  0.125988      NaN  1.053110  0.074528
2017-07-24       NaN      NaN  0.208797  0.268183
2017-07-25  0.800954  0.00291  1.212054  1.790770
2017-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]: df2
Out[118]:
A         B         C         D      E
2017-07-21  0.888811 -0.039728  0.660442 -1.056913    one
2017-07-22  1.267505 -0.044836  1.275167  1.035113    one
2017-07-23  0.125988 -1.829078  1.053110  0.074528    two
2017-07-24 -0.139170 -0.704593  0.208797  0.268183  three
2017-07-25  0.800954  0.002910  1.212054  1.790770   four
2017-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'] = 0
df.iat[0,1] = 0


获取行数
len()


len(df)
Out[147]: 6


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

df.loc[:,'D'] = np.array([1,2,3,5,4,5])

df
Out[149]:
A         B         C  D    F
2017-07-21  0.888811 -0.039728  0.660442  1  NaN
2017-07-22  1.267505 -0.044836  1.275167  2  1.0
2017-07-23  0.125988 -1.829078  1.053110  3  2.0
2017-07-24 -0.139170 -0.704593  0.208797  5  3.0
2017-07-25  0.800954  0.002910  1.212054  4  4.0
2017-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]: df1
Out[170]:
A         B         C  D    F   E
2017-07-21  0.888811 -0.039728  0.660442  1  NaN NaN
2017-07-22  1.267505 -0.044836  1.275167  2  1.0 NaN
2017-07-23  0.125988 -1.829078  1.053110  3  2.0 NaN
2017-07-24 -0.139170 -0.704593  0.208797  5  3.0 NaN
2017-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      E
2017-07-21  False  False  False  False   True   True
2017-07-22  False  False  False  False  False   True
2017-07-23  False  False  False  False  False   True
2017-07-24  False  False  False  False  False   True
2017-07-25  False  False  False  False  False  False


五.相关操作

统计

一般不包括NaN

执行描述性统计,默认按0轴操作

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


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

In [179]: df.mean(1)
Out[179]:
2017-07-21    0.627381
2017-07-22    1.099567
2017-07-23    0.870004
2017-07-24    1.473007
2017-07-25    2.003183
2017-07-26    1.793867
Freq: D, dtype: float64


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

df.sub(s, axis=0)
Out[188]:
A         B         C    D    F
2017-07-21 -0.111189 -1.039728 -0.339558  0.0  NaN
2017-07-22 -1.732495 -3.044836 -1.724833 -1.0 -2.0
2017-07-23 -4.874012 -6.829078 -3.946890 -2.0 -3.0
2017-07-24       NaN       NaN       NaN  NaN  NaN
2017-07-25 -5.199046 -5.997090 -4.787946 -2.0 -2.0
2017-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       a
1       b
2       c
3    aaba
4    baca
5     NaN
6    caba
7     dog
8     cat
dtype: object


保存文件

df.to_csv('路径',encoding='gbk')
df=pd.read_csv('路径',encoding='gbk')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: