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
- pandas
- pandas
- Pandas
- pandas
- pandas
- pandas
- pandas
- Pandas
- pandas
- pandas
- pandas
- pandas
- pandas
- pandas
- Pandas
- pandas小记:pandas数据结构
- pandas 基础
- Pandas使用
- STL set
- 实现一个shell提示语句
- Team Queue (优先对列的嵌套)
- 补间动画和帧动画
- netty学习二:基于socket通讯的小demo
- pandas
- 1155: 字符串比较 多实例
- NYOJ 21-三个水杯(BFS搜索)
- POJ1797Heavy Transportation 最短路变形
- android开发:安装搭建android开发环境
- CSU
- 02、Tensroflow简单例子
- 求两个数中的最大值最小值算法
- MySQl数据库-批量添加数据的两种方法