pandas

来源:互联网 发布:泰达有线网络客服电话 编辑:程序博客网 时间:2024/06/05 02:33

  • pandas
    • 文件读写
      • 文件读取
      • 存入文件
    • 预处理
      • 创建dataframe
      • 简单处理
      • 分组及排序
        • 全组排序组内排序及标号
      • 筛选
        • 简单操作
        • lambda函数筛选
        • where筛选
        • query筛选
        • 重复值处理
      • 切片
        • 切片方法
        • loc
        • iloc
        • at
        • iat
      • 索引
        • 设置索引
        • 布尔索引
        • 多重索引

pandas

文件读写

文件读取

# !/user/bin/python# -- coding: UTF-8 --import numpy as npimport pandas as pduid=pd.read_csv(r'C:\Users\Administrator\Desktop\uid_countrycode.csv',header=0)

存入文件

other.to_csv(r'C:\Users\Administrator\Desktop\new.csv',sep=',')

预处理

创建dataframe

import pandas as pda=[1,2,3]b=[5,6,7]c={"a" : a, "b" : b}#将列表a,b转换成字典data=pd.DataFrame(c)#将字典转换成为数据框print(data)

简单处理

查看数据类型

data.dtypes

拼接

uid=[vmoney,paytime,viewtime]uid=pd.concat(uid)#注意合并以后重置indexuid = uid.reset_index(drop=True)

匹配合并

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')

命名列名

other.columns=['a','b','c']

替换列值

#前提只r1列存在data.r1=list(range(len(data.index)))print data        fecha  r1  r2  r30  2017-05-01   0   8   61  2017-05-02   1  17   42  2017-05-03   2  16  113  2017-05-04   3   1   24  2017-05-05   4  19   9

创建新列

data['r4']=list(range(len(data.index)))print data        fecha  r1  r2  r3  r40  2017-05-01   5  14   7   01  2017-05-02   4   5   4   12  2017-05-03  16   6  11   23  2017-05-04   3   8   8   3#加标签列/分类列game.loc[game.onehour>0.5,'new']='A'game['new']=game['new'].fillna('B')print game         type  num  onehour  fake_pcu200        day new0     DOTA II  237     0.49         0.21   2017/7/1   B1     DOTA II  206     0.52         0.20   2017/7/2   A2     DOTA II  231     0.52         0.24   2017/7/3   A3     DOTA II  233     0.53         0.26   2017/7/4   A4     DOTA II  273     0.56         0.26   2017/7/5   A5     DOTA II  275     0.54         0.26   2017/7/6   A6     DOTA II  251     0.53         0.27   2017/7/7   A

分组及排序

#按'type'和'new'列分组,对指定列'onehour'求和#如果不指定求和列,默认对剩余所有列求和game=game.groupby(['type','new'])['onehour'].sum().reset_index()print game                             type new  onehour0                         DOTA II   A     4.281                         DOTA II   B     1.482          Gerena RoV:Mobile MOBA   A     4.953          Gerena RoV:Mobile MOBA   B     1.244              Grand Theft Auto V   A     4.815              Grand Theft Auto V   B     1.38#按指定列排序game.sort_values(by=['onehour'],ascending=False)#按索引排序game.sort_index()

全组排序、组内排序及标号

data['sort_num']=data['comment_num'].rank(ascending=0,method='dense')
第一个参数 ascending,就是选择是升序还是降序排列。
第二个参数
method=’dense’
这里写图片描述
method=’first’
这里写图片描述
method=’min’
这里写图片描述
method=’max’
这里写图片描述

组内排序
data['group_sort']=data['comment_num'].groupby(data['cate']).rank(ascending=0,method='dense')
这里写图片描述

筛选

简单操作

筛选出指定行

ID=uid.loc[uid['countrycode']=='ID']other=uid.loc[uid['countrycode'].isin(['VN','TH','ID'])==False]

筛选掉带空值的行

other=other.dropna()

对缺失值填充

other=other.fillna()

分组

other=other.groupby('countrycode')a=[x for x in other]

lambda函数筛选

lambda 参数:表达式

In [85]: df1Out[85]:           A         B         C         Da -0.023688  2.410179  1.450520  0.206053b -0.251905 -2.213588  1.063327  1.266143c  0.299368 -0.863838  0.408204 -1.048089d -0.025747 -0.988387  0.094055  1.262731e  1.289997  0.082423 -0.055758  0.536580f -0.489682  0.369374 -0.034571 -2.484478In [86]: df1.loc[lambda df: df.A > 0, :]Out[86]:           A         B         C         Dc  0.299368 -0.863838  0.408204 -1.048089e  1.289997  0.082423 -0.055758  0.536580In [90]: df1.A.loc[lambda s: s > 0]Out[90]: c    0.299368e    1.289997Name: A, dtype: float64

where筛选

where语句保留了原始series/dataframe的长度和大小,不满足条件的值默认被替换为空值NaN

In [166]: df[df < 0]Out[166]:                    A         B         C         D2000-01-01 -2.104139 -1.309525       NaN       NaN2000-01-02 -0.352480       NaN -1.192319       NaN2000-01-03 -0.864883       NaN -0.227870       NaN2000-01-04       NaN -1.222082       NaN -1.233203#where有other参数,用于替换不满足条件的值In [167]: df.where(df < 0, -df)Out[167]:                    A         B         C         D2000-01-01 -2.104139 -1.309525 -0.485855 -0.2451662000-01-02 -0.352480 -0.390389 -1.192319 -1.6558242000-01-03 -0.864883 -0.299674 -0.227870 -0.2810592000-01-04 -0.846958 -1.222082 -0.600705 -1.233203#参数还可以为函数In [185]: df3 = pd.DataFrame({'A': [1, 2, 3],   .....:                     'B': [4, 5, 6],   .....:                     'C': [7, 8, 9]})   .....: In [186]: df3.where(lambda x: x > 4, lambda x: x + 10)Out[186]:     A   B  C0  11  14  71  12   5  82  13   6  9

DataFrame.where()不同于numpy.where()
df1.where(m, df2)=np.where(m, df1, df2)

In [177]: df.where(df < 0, -df) == np.where(df < 0, df, -df)Out[177]:                A     B     C     D2000-01-01  True  True  True  True2000-01-02  True  True  True  True2000-01-03  True  True  True  True#在np里还可以根据where分组贴标签#如果price列的值>3000,group列显示high,否则显示lowdf_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')#对复合多个条件的数据进行分组标记df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1

.query()筛选

query括号内允许使用表达式

In [190]: df = pd.DataFrame(np.random.rand(6, 3), columns=list('abc'))In [191]: dfOut[191]:           a         b         c0  0.438921  0.118680  0.8636701  0.138138  0.577363  0.6866022  0.595307  0.564592  0.5206303  0.913052  0.926075  0.6161844  0.078718  0.854477  0.8987255  0.076404  0.523211  0.591538# pure pythonIn [192]: df[(df.a < df.b) & (df.b < df.c)]Out[192]:           a         b         c1  0.138138  0.577363  0.6866024  0.078718  0.854477  0.8987255  0.076404  0.523211  0.591538# queryIn [193]: df.query('(a < b) & (b < c)')Out[193]:           a         b         c1  0.138138  0.577363  0.6866024  0.078718  0.854477  0.8987255  0.076404  0.523211  0.591538# 括号内也可以是比较复杂的表达式# short query syntaxIn [250]: shorter = df.query('a < b < c and (not bools) or bools > 2')# equivalent in pure PythonIn [251]: longer = df[(df.a < df.b) & (df.b < df.c) & (~df.bools) | (df.bools > 2)]

重复值处理

切片

#生成随机dataframeimport random as rdimport pandas as pdr1=[rd.randrange(1,20) for x in xrange(62)]r2=[rd.randrange(1,20) for x in xrange(62)]r3=[rd.randrange(1,20) for x in xrange(62)]fecha=pd.date_range('2017-05-01','2017-07-01')data=pd.DataFrame({'fecha':fecha,'r1':r1,'r2':r2,'r3':r3})print data

注意此处xrange作用类似range, 但range结果为list, xrange结果是一个生成器。要生成较大的数字序列时,xrange比range节省内存空间。

[ ]切片方法

In [31]: s[:5]Out[31]: 2000-01-01    0.4691122000-01-02    1.2121122000-01-03   -0.8618492000-01-04    0.7215552000-01-05   -0.424972In [32]: s[::2] #跳行取Out[32]: 2000-01-01    0.4691122000-01-03   -0.8618492000-01-05   -0.424972In [33]: s[::-1] #逆序取Out[33]: 2000-01-05   -0.4249722000-01-04    0.7215552000-01-03   -0.8618492000-01-02    1.2121122000-01-01    0.469112

按照索引实现列切片或区域切片

# 行选择data1=data[1:5]print data1       fecha  r1  r2  r31 2017-05-02   3   6  152 2017-05-03  14  14  113 2017-05-04   6   8  124 2017-05-05  13  14   2# 列选择data2=data[['r1','r2']]print data2    r1  r20   17  191    3   62   14  143    6   84   13  145    3  146   18  127   15  188    3  119    1  1410   7  1611  13   212   2  1213  16  1014  14   615  10  1216  13  1317   6  1518  13   419  16  1320   6  1721   2   322  10   323  17   624  19   525  15  1626  12  1527  13   928  11   729   8   130   4  1831  13   4# 区块选择data3=data[:10][['r1','r2']]print data3   r1  r20  17  191   3   62  14  143   6   84  13  145   3  146  18  127  15  188   3  119   1  14

.loc

按照标签进行行列选择
注意.loc的切片结果包括了第五行,而[ ]不包括。

data1=data.loc[1:5]print data1       fecha  r1  r2  r31 2017-05-02   5  16  142 2017-05-03   9   5  193 2017-05-04   9   7  184 2017-05-05   2   4  125 2017-05-06  16  18   4

注意下列写法:

In [15]: df.loc[:,['B', 'A']] = df[['A', 'B']].valuesIn [16]: df[['A', 'B']]Out[16]:                    A         B2000-01-01  0.469112 -0.2828632000-01-02  1.212112 -0.1732152000-01-03 -0.861849 -2.104569

补充

#取特定列data=data.loc[:,['r1','r3']]print data    r1  r30    8   31    2  182   18   63    1   94   13   8#取连续列报错data=data.loc[:,['r1':'r3']]#取连续列正确方式data=data.loc[:,'r1':'r3']print data    r1  r2  r30    8  18  151    9  13  122   10  18   23   14  17   24    1   2  16

.loc还能选择特定日期内的数据。但要求日期在索引内。

data_fecha=data.set_index('fecha')print data_fecha            r1  r2  r3fecha2017-05-01  15   4  132017-05-02   8   4  112017-05-03   6   8  102017-05-04   9  19   12017-05-05  12   9   72017-05-06  18   6   82017-05-07  17  14  172017-05-08   1  13  162017-05-09  13   2   72017-05-10   8  16   52017-05-11  13   7  162017-05-12   6  11  182017-05-13  11   7  132017-05-14   1  13  122017-05-15  19  11   42017-05-16   4   8  142017-05-17   2  14  152017-05-18   6  15   62017-05-19  13   9   42017-05-20   3  10   72017-05-21  11  12  102017-05-22   5  17  112017-05-23   7  18  172017-05-24   3  17   22017-05-25  10   8  172017-05-26   3  16   92017-05-27   9   1   62017-05-28   8   8  172017-05-29   9   9  162017-05-30   4  10   62017-05-31   8  18  142017-06-01  14  15  14#生成两个特定日期fecha1=dt.datetime(2017,5,5)fecha2=dt.datetime(2017,5,10)#生成切片数据data1=data_fecha.loc[fecha1:fecha2]print data1            r1  r2  r3fecha                 2017-05-05  18   6  102017-05-06  19  12  142017-05-07  16  15   82017-05-08   8  17  102017-05-09  11  14   82017-05-10   7  19  16

.iloc

按照索引选取,其括号内只能为数值。

#行选择data1=data[1:5]print data1       fecha  r1  r2  r31 2017-05-02   1   6   72 2017-05-03  15   9  153 2017-05-04  15  10  134 2017-05-05  15  15  14#列选择data2=data.iloc[:,[1,3]]print data2    r1  r30    2  181    1   72   15  153   15  134   15  145   16   76   16   97    1   58    3   99    2   110   1  1711  19   312   2   213   6  1414   9  1015  13   616  14  1417   9   818  16  1319  11  1420   7  1021   1  1222  13   123  12  1924  15  1725  18   826   6  1727  15   328   5  1229  12   130  14  1931  17  13#切片选择data3=data.iloc[[1,5],[1,3]]print data3   r1  r31   1   75  16   7

.at

通过标签访问单个元素,速度比.loc快

a=data.iat[4,'r1']print a12

.iat

类似.iloc,访问索引提取元素

a=data.iat[4,1]print a12

索引

设置索引

#将原有某列设置为索引data_fecha=data.set_index('fecha')            r1  r2  r3fecha2017-05-01  15   4  132017-05-02   8   4  112017-05-03   6   8  102017-05-04   9  19   12017-05-05  12   9   7#添加新列为索引data.index=data['fecha']                fecha  r1  r2  r3fecha                            2017-05-01 2017-05-01   6   2  172017-05-02 2017-05-02  17  18   52017-05-03 2017-05-03   1   9  18

布尔索引

In [140]: df2 = pd.DataFrame({'a' : ['one', 'one', 'two', 'three', 'two', 'one', 'six'],   .....:                     'b' : ['x', 'y', 'y', 'x', 'y', 'x', 'x'],   .....:                     'c' : np.random.randn(7)})   .....: # only want 'two' or 'three'In [141]: criterion = df2['a'].map(lambda x: x.startswith('t'))In [142]: df2[criterion]Out[142]:        a  b         c2    two  y  0.0412903  three  x  0.3617194    two  y -0.238075# equivalent but slowerIn [143]: df2[[x.startswith('t') for x in df2['a']]]Out[143]:        a  b         c2    two  y  0.0412903  three  x  0.3617194    two  y -0.238075# Multiple criteriaIn [144]: df2[criterion & (df2['b'] == 'x')]Out[144]:        a  b         c3  three  x  0.361719

多重索引

In [152]: s_mi = pd.Series(np.arange(6),index=pd.MultiIndex.from_product([[0, 1], ['a', 'b', 'c']]))In [153]: s_miOut[153]: 0  a    0   b    1   c    21  a    3   b    4   c    5In [154]: s_mi.iloc[s_mi.index.isin([(1, 'a'), (2, 'b'), (0, 'c')])]Out[154]: 0  c    21  a    3In [155]: s_mi.iloc[s_mi.index.isin(['a', 'c', 'e'], level=1)]Out[155]: 0  a    0   c    21  a    3   c    5

详细见官方文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy