一、pandas概述

  pandas :pannel data analysis(面板数据分析)。pandas是基于numpy构建的,为时间序列分析提供了很好的支持。pandas中有两个主要的数据结构,一个是Series,另一个是DataFrame。

Series

Series是一种一维数据结构,类似字典或者Numpy中元素带标签的数组。但是比字典更为强大。其中每一个元素都有一个标签(索引),标签可以是数字或者字符串。具有索引,具有键值对应关系,能够排序,切片Slice等等操作。

DataFrame

DataFrame是一个二维的表结构。Pandas的DataFrame可以存储许多种不同的数据类型,但是每一个列的数据都是同一个数据类型,并且每一个坐标轴都有自己的标签(索引)。你可以把它想象成一个Series的字典项。

1.1 创建Series

利用一个List创建一个Series,Pandas会默认创建整型索引

import pandas as pd
import numpy as np s =pd.Series([0,1,2,3,4,np.NAN,5,'A']) In [74]:s
Out[74]:
0 0
1 1
2 2
3 3
4 4
5 NaN
6 5
7 A
dtype: object

2.1 创建DataFrame

方法一:使用一个数组array,指定索引,列名

dates = pd.date_range('20130101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['A','B','C','D'])
In [76]:df
Out[76]:
A B C D
2013-01-01 -2.359309 -0.065001 1.099911 -0.886392
2013-01-02 0.318336 0.715261 0.060752 1.326758
2013-01-03 0.515914 1.482326 -0.973154 1.766126
2013-01-04 1.875221 -0.316619 -0.543997 0.864037
2013-01-05 -0.697887 0.065137 -0.899040 0.826392
2013-01-06 -0.205943 -1.532289 1.849114 1.267895

方法二:使用字典创建DataFrame

df2 = pd.DataFrame({'A':1,
'B':pd.Timestamp('20130102'),
'C':pd.Series(1,index=range(4)),
'D':np.array([3]*4,dtype='int'),
'E':'foo'}) In [78]:df2
Out[78]:
A B C D E
0 1 2013-01-02 1 3 foo
1 1 2013-01-02 1 3 foo
2 1 2013-01-02 1 3 foo
3 1 2013-01-02 1 3 foo

2.1.1 常用的基本功能

1、查看前N行或者后M行数据

In [80]:df.head(2)
Out[80]:
A B C D
2013-01-01 -2.359309 -0.065001 1.099911 -0.886392
2013-01-02 0.318336 0.715261 0.060752 1.326758
In [81]:df.tail(2)
Out[81]:
A B C D
2013-01-05 -0.697887 0.065137 -0.899040 0.826392
2013-01-06 -0.205943 -1.532289 1.849114 1.267895

2、查看索引

In [82]:df.index
Out[82]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01, ..., 2013-01-06]
Length: 6, Freq: D, Timezone: None

3、查看值

In [83]:df.values
Out[83]:
array([[-2.35930948, -0.06500052, 1.09991148, -0.88639213],
[ 0.31833619, 0.71526129, 0.06075226, 1.32675777],
[ 0.51591397, 1.48232627, -0.97315391, 1.76612637],
[ 1.87522057, -0.31661914, -0.54399686, 0.86403681],
[-0.69788733, 0.06513657, -0.89903951, 0.82639165],
[-0.20594297, -1.53228941, 1.84911405, 1.26789462]])

4、查看列名

In [84]:df.columns
Out[84]: Index([u'A', u'B', u'C', u'D'], dtype='object')In [85]: In [85]:df.dtypes
Out[85]:
A float64
B float64
C float64
D float64
dtype: object

5、查看数据有多少行

In [74]:len(df)
Out[74]: 6

6、查看数据Summary信息(均值、方差、最小、最大,分位数)

In [9]:df.describe()
Out[9]:
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean 0.329473 0.087595 -0.172075 0.308271
std 0.595492 1.106105 0.524659 0.864240
min -0.218562 -1.454443 -0.992808 -0.790523
25% 0.112395 -0.458519 -0.362685 -0.434517
50% 0.135337 0.000715 -0.197997 0.653177
75% 0.281296 0.630096 0.137386 0.864773
max 1.490029 1.750290 0.524751 1.195568

7、复制一个完全一样的对象

In [11]:df2 = df.copy()
In [11]:df2
Out[11]:
A B C D
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-03 0.329824 1.750290 -0.085930 0.891737
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513
2013-01-05 0.104873 0.150260 0.211825 -0.790523
2013-01-06 -0.218562 0.790041 -0.992808 0.783881

8、对数据进行行列转置

In [12]:df.T
Out[12]:
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
A 0.134964 1.490029 0.329824 0.135711 0.104873 -0.218562
B -1.454443 -0.561749 1.750290 -0.148830 0.150260 0.790041
C -0.310064 0.524751 -0.085930 -0.380225 0.211825 -0.992808
D 1.195568 0.522473 0.891737 -0.753513 -0.790523 0.783881

9、对数据进行行列转置

In [12]:df.T
Out[12]:
2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06
A 0.134964 1.490029 0.329824 0.135711 0.104873 -0.218562
B -1.454443 -0.561749 1.750290 -0.148830 0.150260 0.790041
C -0.310064 0.524751 -0.085930 -0.380225 0.211825 -0.992808
D 1.195568 0.522473 0.891737 -0.753513 -0.790523 0.783881

10、对数据进行行列转置

df.set_index=df['A']

11、对数据进行行列转置

In [74]:df2.columns = ['E','F','G','H']
In [74]:df2
Out[74]:
E F G H
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-03 0.329824 1.750290 -0.085930 0.891737
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513
2013-01-05 0.104873 0.150260 0.211825 -0.790523
2013-01-06 -0.218562 0.790041 -0.992808 0.783881

2.1.2 进行选择、过滤、切片等操作

索引,根据标签(索引)进行行操作

  • loc是字符串标签的索引方法,
  • iloc是数字标签的索引方法,
  • ix是一个字符串标签的索引方法,同样支持数字标签索引作为它的备选。

备注:ix虽然支持字符和数字切片,但有一些轻微的不可预测性,数字标签可能会让ix做出一些奇怪的事情,例如将一个数字解释成一个位置。而loc和iloc则为你带来了安全的、可预测的。ix要比loc和iloc更快。虽然loc是对字符串进行索引,但是如果索引是数字的时候,loc也可以进行索引,貌似有一点矛盾,需要实操时进行体会。

1、选择一列

- 方法一、df['A']
- 方法二、df.A
- 方法三、df.loc[:,['A']]
In [20]:df['A']
Out[20]:
2013-01-01 0.134964
2013-01-02 1.490029
2013-01-03 0.329824
2013-01-04 0.135711
2013-01-05 0.104873
2013-01-06 -0.218562
Freq: D, Name: A, dtype: float64

2、选择两列或者多列

- 方法一、df[['A','B']]
- 方法二、df.loc[:,['A','B']]
- 方法三、df.ix[:,['A','B']]
In [20]:df[['A','B']]
Out[29]:
A B
2013-01-01 0.134964 -1.454443
2013-01-02 1.490029 -0.561749
2013-01-03 0.329824 1.750290
2013-01-04 0.135711 -0.148830
2013-01-05 0.104873 0.150260
2013-01-06 -0.218562 0.790041

3、根据某一列或者几列进行条件筛选

In [30]:df[(df.A>0) & (df.B<0)]
Out[30]:
A B C D
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513

4、索引是数字的使用iloc

In [35]: df1 = pd.DataFrame(np.random.randn(4,4),index=[1,2,3,4],columns=['A','B','C','D'])
In [36]: df1
Out[36]:
A B C D
1 0.913335 -0.209641 -0.994628 -0.300057
2 1.260923 0.405731 -0.566145 -1.114782
3 0.437972 1.800594 -0.269038 -0.038466
4 -0.239472 0.290871 0.207056 0.105834
#查看某一行
In [40]: df.iloc[3]
Out[40]:
A 0.135711
B -0.148830
C -0.380225
D -0.753513
Name: 2013-01-04 00:00:00, dtype: float64
#由于df1的索引是数字,体会一会这里使用loc和iloc的区别
In [25]:df1.loc[1:2]
Out[25]:
A B C D
1 -0.762372 -0.390335 0.037414 2.104834
2 1.265755 -0.113307 1.443822 -2.765101 In [26]:df1.iloc[1:2]
Out[26]:
A B C D
2 1.265755 -0.113307 1.443822 -2.765101
#查看第二行到第三行
In [69]:df.iloc[1:3,:]
Out[69]:
A B C D
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-03 0.329824 1.750290 -0.085930 0.891737
#查看第一行到第二行,第一列到第三列
In [70]:df.iloc[0:2,0:3]
Out[70]:
A B C
2013-01-01 0.134964 -1.454443 -0.310064
2013-01-02 1.490029 -0.561749 0.524751
#挑某几列进行查看,如位置第1,2,4行,第0,2列
In [71]:df.iloc[[1,2,4],[0,2]]
Out[71]:
A C
2013-01-02 1.490029 0.524751
2013-01-03 0.329824 -0.085930
2013-01-05 0.104873 0.211825

5、索引不是数字,是字符的使用loc

#索引是Date挑 '2013-01-03':'2013-01-05'几行
In [54]:df.loc['2013-01-03':'2013-01-05']
Out[54]:
A B C D
2013-01-03 0.329824 1.75029 -0.085930 0.891737
2013-01-04 0.135711 -0.14883 -0.380225 -0.753513
2013-01-05 0.104873 0.15026 0.211825 -0.790523
In [55]:df.ix['2013-01-03':'2013-01-05']
Out[55]:
A B C D
2013-01-03 0.329824 1.75029 -0.085930 0.891737
2013-01-04 0.135711 -0.14883 -0.380225 -0.753513
2013-01-05 0.104873 0.15026 0.211825 -0.790523
#第1到3列
In [53]:df.iloc[:,1:3]
Out[53]:
B C
2013-01-01 -1.454443 -0.310064
2013-01-02 -0.561749 0.524751
2013-01-03 1.750290 -0.085930
2013-01-04 -0.148830 -0.380225
2013-01-05 0.150260 0.211825
2013-01-06 0.790041 -0.992808
# 第3到5行,A、B列
In [52]:df.loc['2013-01-03':'2013-01-05',['A','B']]
Out[52]:
A B
2013-01-03 0.329824 1.75029
2013-01-04 0.135711 -0.14883
2013-01-05 0.104873 0.15026
In [56]:df.ix[1:2]
Out[56]:
A B C D
2013-01-02 1.490029 -0.561749 0.524751 0.522473

6、排序

#对索引排序
In [57]:df.sort_index(ascending=False)
Out[57]:
A B C D
2013-01-06 -0.218562 0.790041 -0.992808 0.783881
2013-01-05 0.104873 0.150260 0.211825 -0.790523
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513
2013-01-03 0.329824 1.750290 -0.085930 0.891737
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
#根据某一列进行排序
In [58]:df.sort(columns='B')
Out[58]:
A B C D
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
2013-01-02 1.490029 -0.561749 0.524751 0.522473
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513
2013-01-05 0.104873 0.150260 0.211825 -0.790523
2013-01-06 -0.218562 0.790041 -0.992808 0.783881
2013-01-03 0.329824 1.750290 -0.085930 0.891737
#根据某几列进行排序
In [59]:df.sort(columns=['A','B'])
Out[59]:
A B C D
2013-01-06 -0.218562 0.790041 -0.992808 0.783881
2013-01-05 0.104873 0.150260 0.211825 -0.790523
2013-01-01 0.134964 -1.454443 -0.310064 1.195568
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513
2013-01-03 0.329824 1.750290 -0.085930 0.891737
2013-01-02 1.490029 -0.561749 0.524751 0.522473

7、缺失值处理

In [66]:df3 = df.reindex(index=dates[0:4], columns = list(df.columns)+['E'])
In [66]:df3.loc[dates[0]:dates[1],['E']]=1
In [66]:df3
Out[63]:
A B C D E
2013-01-01 0.134964 -1.454443 -0.310064 1.195568 1
2013-01-02 1.490029 -0.561749 0.524751 0.522473 1
2013-01-03 0.329824 1.750290 -0.085930 0.891737 NaN
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513 NaN
# 删除缺失值
In [60]: df3.dropna(how='any')
Out[60]:
A B C D E
2013-01-01 0.134964 -1.454443 -0.310064 1.195568 1
2013-01-02 1.490029 -0.561749 0.524751 0.522473 1
# 对缺失值进行填充
In [68]:df3.fillna(value=5)
Out[68]:
A B C D E
2013-01-01 0.134964 -1.454443 -0.310064 1.195568 1
2013-01-02 1.490029 -0.561749 0.524751 0.522473 1
2013-01-03 0.329824 1.750290 -0.085930 0.891737 5
2013-01-04 0.135711 -0.148830 -0.380225 -0.753513 5

2.1.3 使用函数求值以及Apply的使用方法

In [69]:df.mean()
Out[69]:
A 0.634212
B -0.517503
C -0.360313
D -0.178633
dtype: float64
In [70]:df.apply(np.cumsum)
Out[70]:
A B C D
2013-01-01 -1.083703 -0.984847 0.231595 0.764466
2013-01-02 -0.277971 -0.737865 -0.366301 -0.768202
2013-01-03 -0.271485 -1.006928 -0.246741 -0.483353
2013-01-04 2.491598 0.096372 -2.159432 -0.331738
2013-01-05 2.624991 -1.882532 -2.445247 -1.636275
2013-01-06 3.805273 -3.105017 -2.161877 -1.071797 In [71]:df.apply(lambda x: x.max() - x.min())
Out[71]:
A 3.846786
B 3.082203
C 2.196061
D 2.297133
dtype: float64

三、用法

  一、生成数据表
1、首先导入pandas库,一般都会用到numpy库,所以我们先导入备用:
import numpy as np
import pandas as pd
2、导入CSV或者xlsx文件:
df = pd.DataFrame(pd.read_csv(‘name.csv’,header=1))
df = pd.DataFrame(pd.read_excel(‘name.xlsx’))
3、用pandas创建数据表:
df = pd.DataFrame({“id”:[1001,1002,1003,1004,1005,1006],
“date”:pd.date_range(‘20130102’, periods=6),
“city”:[‘Beijing ‘, ‘SH’, ’ guangzhou ‘, ‘Shenzhen’, ‘shanghai’, ‘BEIJING ‘],
“age”:[23,44,54,32,34,32],
“category”:[‘100-A’,’100-B’,’110-A’,’110-C’,’210-A’,’130-F’],
“price”:[1200,np.nan,2133,5433,np.nan,4432]},
columns =[‘id’,’date’,’city’,’category’,’age’,’price’])
2、数据表信息查看
1、维度查看:
df.shape
2、数据表基本信息(维度、列名称、数据格式、所占空间等):
df.info()
3、每一列数据的格式:
df.dtypes
4、某一列格式:
df[‘B’].dtype
5、空值:
df.isnull()
6、查看某一列空值:
df.isnull()
7、查看某一列的唯一值:
df[‘B’].unique()
8、查看数据表的值:
df.values
9、查看列名称:
df.columns
10、查看前10行数据、后10行数据:
df.head() #默认前10行数据
df.tail() #默认后10 行数据
三、数据表清洗
1、用数字0填充空值:
df.fillna(value=0)
2、使用列prince的均值对NA进行填充:
df[‘prince’].fillna(df[‘prince’].mean())
3、清楚city字段的字符空格:
df[‘city’]=df[‘city’].map(str.strip)
4、大小写转换:
df[‘city’]=df[‘city’].str.lower()
5、更改数据格式:
df[‘price’].astype(‘int’)
6、更改列名称:
df.rename(columns={‘category’: ‘category-size’})
7、删除后出现的重复值:
df[‘city’].drop_duplicates()
8、删除先出现的重复值:
df[‘city’].drop_duplicates(keep=’last’)
9、数据替换:
df[‘city’].replace(‘sh’, ‘shanghai’)
四、数据预处理
df1=pd.DataFrame({“id”:[1001,1002,1003,1004,1005,1006,1007,1008],
“gender”:[‘male’,’female’,’male’,’female’,’male’,’female’,’male’,’female’],
“pay”:[‘Y’,’N’,’Y’,’Y’,’N’,’Y’,’N’,’Y’,],
“m-point”:[10,12,20,40,40,40,30,20]})
1、数据表合并
df_inner=pd.merge(df,df1,how=’inner’) # 匹配合并,交集
df_left=pd.merge(df,df1,how=’left’) #
df_right=pd.merge(df,df1,how=’right’)
df_outer=pd.merge(df,df1,how=’outer’) #并集
2、设置索引列
df_inner.set_index(‘id’)
3、按照特定列的值排序:
df_inner.sort_values(by=[‘age’])
4、按照索引列排序:
df_inner.sort_index()
5、如果prince列的值>3000,group列显示high,否则显示low:
df_inner[‘group’] = np.where(df_inner[‘price’] > 3000,’high’,’low’)
6、对复合多个条件的数据进行分组标记
df_inner.loc[(df_inner[‘city’] == ‘beijing’) & (df_inner[‘price’] >= 4000), ‘sign’]=1

玩转pandas的更多相关文章

  1. 用实战玩转pandas数据分析(一)——用户消费行为分析(python)

      CD商品订单数据的分析总结.根据订单数据(用户的消费记录),从时间维度和用户维度,分析该网站用户的消费行为.通过此案例,总结订单数据的一些共性,能通过用户的消费记录挖掘出对业务有用的信息.对其他产 ...

  2. 【笔记】Pandas分类数据详解

    [笔记]Pandas分类数据详解 Pandas  Pandas分类数据详解|轻松玩转Pandas(5) 参考:Pandas分类数据详解|轻松玩转Pandas(5)

  3. Pandas基本功能详解

    Pandas基本功能详解 Pandas  Pandas基本功能详解 |轻松玩转Pandas(2) 参考:Pandas基本功能详解 |轻松玩转Pandas(2)

  4. 五、Pandas玩转数据

    Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...

  5. pandaboy玩pandas

    基于python的三方库pandas的excel表二次开发 import numpy as np import pandas as pd import time from pandas import ...

  6. pandas玩转excel-> (1)如何利用pandas创建【行,列,单元格】

    import pandas as pd #------新建单元格的方法一:通过先创建字典的形式 #可以先新建一个字典d={'x':100,'y':200,'z':300} #打印字典的索引print( ...

  7. pandas玩转excel-> (2)如何利用pandas读取excel数据文件

    import pandas as pd #将excel文件读到内存中,形成dataframe,并命名为peoplepeople=pd.read_excel('D:/python结果/task2/Peo ...

  8. pandas玩转excel-> (1)如何利用pandas创建excel数据文件

    #在Anaconda3 的Spyder中   #定义pandas模块为pd import pandas as pd   #创建一个新的DataFrame对象,定义这个对象中有两个字段:ID和Name, ...

  9. Python数据分析:pandas玩转Excel (二)

    1 对Excel文件的操作 方法一: 使用xlrd库或者xlwt库进行对excel表格的操作读与写: 方法二: pandas库同样支持excel的读写操作:且更加简便. 2 pd.read_excel ...

随机推荐

  1. Flex colorTranfrom使用说明

    这次使用colorTranfrom主要用来将一个已有的过渡颜色映射到其他颜色条.发现这个colorTranfrom很好使用,于是简单研究了下 文档有说明: 使用 ColorTransform 类调整显 ...

  2. multicast based on udp

    1.概念 单播,是用于两个主机之间传送数据; 广播,是一个主机对局域网内的所有主机发送数据; 多播,又称为组播,它是对一组特定的主机通信. 将网络上同一类型业务逻辑上分组,只和组内的成员通信,其它主机 ...

  3. iOS敏捷开发之道,经常使用的宏定义总结

    iOS开发中,直接在pch文件里导入宏定义. 在做项目的时候,直接拿过来使用,能够大幅度提高开发速度. 以下是 个人总结的一些宏定义. 假设大家有其它的经常使用的宏定义.欢迎加入.我会定期更新这个bl ...

  4. python之斐波那契数列

    斐波那契数列(Fibonacci sequence),又称黄金分割数 这样的一个数列:0,1,1,2,3,8,13,21,34…….. 特别指出:0不是第一项,而是第零项. 在数学上被以 递归的方法定 ...

  5. AOF 持久化策略

    Redis为了解决AOF后台重写造成的数据不一致问题,设置了AOF重写缓冲区.即使设置了no-appendfsync-on-rewrite yes也会造成短暂的主进程阻塞.原因就在于子进程完成AOF重 ...

  6. 关于height:100%不生效的问题

    当你设置一个页面元素的高度(height)为100%时,期望这样元素能撑满整个浏览器窗口的高度,但大多数情况下,这样的做法没有任何效果.你知道为什么height:100%不起作用吗? 按常理,当我们用 ...

  7. Struts2是一个基于MVC设计模式的Web应用框架

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. Struts ...

  8. jetty端口灵活配置方法

    在使用maven开发web项目极大地方便了jar包的依赖,在测试时也可以集成Servlet容器,从启动速度和量级上看,Jetty无疑是不二选择. 如果多个项目同时启动,就会端口冲突了. 一种办法是通过 ...

  9. [Docker]学习笔记--简单介绍

    学习docker已经有一段时间了,一直没有静下心来好好总结一下. 最近用docker搭了一整套Gitlab的持续集成环境.(会在下一篇中详细的讲解具体步骤,敬请期待) 感觉是时候写点东西和大家一起分享 ...

  10. LIS(模板)

    记录一下,O(nlgn)的算法求LIS //HHH #include <iostream> #include <stdio.h> #include <string.h&g ...