在使用dataframe时遇到datafram在列太多的情况下总是自动换行显示的情况,导致数据阅读困难,效果如下:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(1, 20))
print df
显示效果:
0 1 2 3 4 5 6 \
0 -1.193428 -0.870381 -0.970323 -1.062275 1.227282 -3.016298 -0.587623
7 8 9 10 11 12 13 \
0 -0.608017 -0.006382 0.275454 -0.073537 1.217392 -0.12844 -1.228424
14 15 16 17 18 19
0 -1.153452 0.191372 0.582537 0.503437 -2.263716 -0.529881
height has been deprecated.
解决方法:
在代码中设置显示的长宽等,如下代码示例:
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
pd.set_option('display.height',1000)
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
df = pd.DataFrame(np.random.randn(1, 20))
print df
def get_achievement(self):
fc=ts.forecast_data(2016,4)
print fc
上面这个简单的代码意思是获取已经发布的2016年第4季度的业绩预告的上市公司。
中间多了个省略号,就是中间若干的数据因为太多而没有被显示。 那么要怎样才能正常显示所有数据呢???
查看了pandas的官方文档。
pandas.set_option() 可以设置pandas相关的参数,从而改变默认参数。 打印pandas数据事,默认是输出100行,多的话会输出....省略号。
那么可以添加: pandas.set_option('display.max_rows',None)
或者
np.set_printoptions(threshold='nan') #全部输出
import numpy as np
np.set_printoptions(threshold=np.inf)
这样就可以显示全部数据:
def get_achievement(self):
fc=ts.forecast_data(2016,4)
pandas.set_option('display.max_rows',None)
print fc
import numpy as np
import pandas as pd
df = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
name gender age
0 Snow M 22
1 Tyrion M 32
2 Sansa F 18
3 Arya F 14
#打印列名
df.columns
Index(['name', 'gender', 'age'], dtype='object')
df['column_name'] ,df[row_start_index, row_end_index] 选取指定整列数据
df['name']
df['gender']
df[['name','gender']] #选取多列,多列名字要放在list里
df[0:] #第0行及之后的行,相当于df的全部数据,注意冒号是必须的
df[:2] #第2行之前的数据(不含第2行)
df[0:1] #第0行
df[1:3] #第1行到第2行(不含第3行)
df[-1:] #最后一行
df[-3:-1] #倒数第3行到倒数第1行(不包含最后1行即倒数第1行,这里有点烦躁,因为从前数时从第0行开始,从后数就是-1行开始,毕竟没有-0)
loc,在知道列名字的情况下,df.loc[index,column] 选取指定行,列的数据
# df.loc[index, column_name],选取指定行和列的数据
df.loc[0,'name'] # 'Snow'
df.loc[0:2, ['name','age']] #选取第0行到第2行,name列和age列的数据, 注意这里的行选取是包含下标的。
df.loc[[2,3],['name','age']] #选取指定的第2行和第3行,name和age列的数据
df.loc[df['gender']=='M','name'] #选取gender列是M,name列的数据
df.loc[df['gender']=='M',['name','age']] #选取gender列是M,name和age列的数据
iloc,在column name特别长或者index是时间序列等各种不方便输入的情况下,可以用iloc (i = index), iloc完全用数字来定位 iloc[row_index, column_index]
df.iloc[0,0] #第0行第0列的数据,'Snow'
df.iloc[1,2] #第1行第2列的数据,32
df.iloc[[1,3],0:2] #第1行和第3行,从第0列到第2列(不包含第2列)的数据
df.iloc[1:3,[1,2] #第1行到第3行(不包含第3行),第1列和第2列的数据
ix, ix很强大,loc和iloc的功能都能做到 ix[row_index, column_index]
ix虽然强大,然而已经不再被推荐,因为在最新版的pandas里面,ix已经成为deprecated。(https://github.com/pandas-dev/pandas/issues/14218)
大概是因为可以混合label和position导致了很多用户问题和bug。
所以,用label就用loc,用position就用iloc。
df.ix[0,0] #第0行第0列的数据,'Snow'
df.ix[0,[1,2]] #第0行,第1列和第2列的数据
df.ix[0:2,[1,2]] #第0行到第2行(包含第3行),第1列和第2列的数据
df.ix[1,0:2] #第1行,从第0列到第2列(不包含第2列)的数据
切片时,iloc行不含下标上限,loc,ix行包含,列iloc和ix都不含列下标上限
创建数据集
# 导入pandas与numpy
import pandas as pd
import numpy as np
#创建一个dataframe 以时间序列为index 以abcdef为column
date1 = pd.date_range("20170813",periods=6)
df = pd.DataFrame(data=np.random.randint(3,9,size=(6,6)),index=date1,columns=list(["a","b","c","d","e","f"]))
print(df)
a b c d e f
2017-08-13 6 5 5 5 4 4
2017-08-14 3 3 4 3 4 8
2017-08-15 3 5 5 6 5 4
2017-08-16 5 3 5 3 3 4
2017-08-17 3 6 3 4 8 6
2017-08-18 7 6 5 7 4 6
根据column选取
print(df["a"])
2017-08-13 6
2017-08-14 3
2017-08-15 3
2017-08-16 5
2017-08-17 3
2017-08-18 7
Freq: D, Name: a, dtype: int32
根据index进行选取
print(df[0:1])
a b c d e f
2017-08-13 5 6 4 3 3 7
loc函数的使用
# 根据loc函数进行选取指定行
print(df.loc["2017-08-18",:])
# 使用loc函数选取所有行 并对列上的数据进行筛选
print(df.loc[:,("a","b","f")])
# 使用loc函数筛选行与列
print(df.loc["2017-08-14",["b","a","e"]])
a 7
b 6
c 5
d 7
e 4
f 6
Name: 2017-08-18 00:00:00, dtype: int32
a b f
2017-08-13 5 6 7
2017-08-14 5 4 7
2017-08-15 3 6 4
2017-08-16 7 7 7
2017-08-17 7 5 7
2017-08-18 7 8 4
b 4
a 5
e 6
Name: 2017-08-14 00:00:00, dtype: int32
iloc函数的使用
# 使用iloc函数对行与列的位置进行选取
# 使用iloc函数选取第三行第三列的数据
print(df.iloc[3,3])
# 使用iloc函数选取第3行到第5行与第3列到第5列的数据
print(df.iloc[3:5,3:5])
# 使用iloc函数选取1、2、5行与2、4、5列数据
print(df.iloc[[1,2,5],[2,4,5]])
3
d e
2017-08-16 3 5
2017-08-17 4 6
c e f
2017-08-14 8 6 7
2017-08-15 6 5 4
2017-08-18 5 3 4
ix函数
# 使用ix函数综合iloc与loc函数进行筛选 需要注意的是ix函数的第一个参数要使用索引位
print(df.ix[[0,2],[0,3]])
print(df.ix[[0,2],["a","e"]])
a d
2017-08-13 5 3
2017-08-15 3 5
a e
2017-08-13 5 3
2017-08-15 3 5
使用boolean index参数进行切片
print(df[[True,True,False,True,True,False]])
a b c d e f
2017-08-13 6 5 5 5 4 4
2017-08-14 3 3 4 3 4 8
2017-08-16 5 3 5 3 3 4
2017-08-17 3 6 3 4 8 6
# boolean index结合loc函数使用
df.loc[df["a"]>5,df.loc["2017-08-15",:]>4]
b c d e
2017-08-13 5 5 5 4
2017-08-18 6 5 7 4
import pandas as pd 引用pandas时使用pd名称就可
使用DataFrame查看数据(类似SQL中的select):
from pandas import DataFrame #从pandas库中引用DataFrame
df_obj = DataFrame() #创建DataFrame对象
df_obj.dtypes #查看各行的数据格式
df_obj.head() #查看前几行的数据,默认前5行
df_obj.tail() #查看后几行的数据,默认后5行
df_obj.index #查看索引
df_obj.columns #查看列名
df_obj.values #查看数据值
df_obj.describe #描述性统计
df_obj.T #转置
df_obj.sort(columns = '')#按列名进行排序
df_obj.sort_index(by=['',''])#多列排序,使用时报该函数已过时,请用sort_values
df_obj.sort_values(by=['',''])同上
使用DataFrame选择数据(类似SQL中的LIMIT):
df_obj[‘客户名称’] #显示列名下的数据
df_obj[1:3] #获取1-3行的数据,该操作叫切片操作,获取行数据
df_obj.loc[:0,['用户号码','产品名称']] #获取选择区域内的数据,逗号前是行范围,逗号后是列范围,注loc通过标签选择数据,iloc通过位置选择数据
df_obj['套餐'].drop_duplicates() #剔除重复行数据
使用DataFrame重置数据:
df_obj.at[df_obj.index,'支局_维护线']='自有厅' #通过标签设置新的值,如果使用iat则是通过位置设置新的值
使用DataFrame筛选数据(类似SQL中的WHERE):
alist = ['023-18996609823']
df_obj['用户号码'].isin(alist) #将要过滤的数据放入字典中,使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回ture
df_obj[df_obj['用户号码'].isin(alist)] #获取匹配结果为ture的行
使用DataFrame模糊筛选数据(类似SQL中的LIKE):
df_obj[df_obj['套餐'].str.contains(r'.*?语音CDMA.*')] #使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次
使用DataFrame进行数据转换(后期补充说明)
df_obj['支局_维护线'] = df_obj['支局_维护线'].str.replace('巫溪分公司(.{2,})支局','\\1')#可以使用正则表达式
df_obj['支局_维护线'].drop_duplicates() #返回一个移除重复行的数据
可以设置take_last=ture 保留最后一个,或保留开始一个.补充说明:注意take_last=ture已过时,请使用keep='last'
使用pandas中读取文本数据:
read_csv('D:\LQJ.csv',sep=';',nrows=2) #首先输入csv文本地址,然后分割符选择等等
使用pandas聚合数据(类似SQL中的GROUP BY 或HAVING):
data_obj['用户标识'].groupby(data_obj['支局_维护线'])
data_obj.groupby('支局_维护线')['用户标识'] #上面的简单写法
adsl_obj.groupby('支局_维护线')['用户标识'].agg([('ADSL','count')])
#按支局进行汇总对用户标识进行计数,并将计数列的列名命名为ADSL
使用pandas合并数据集(类似SQL中的JOIN):
merge(mxj_obj2, mxj_obj1 ,on='用户标识',how='inner')# mxj_obj1和mxj_obj2将用户标识当成重叠列的键合并两个数据集,inner表示取两个数据集的交集.
def load_excel_data(filename):
data = pd.ExcelFile(filename)
print data.sheet_names
df = data.parse("Sheet1")
id = df['ID']
priority_id = df[u'优先级']
print id
print priority_id
return id,priority_id
import pandas as pd
xlsfile = r'D:\workfile\uv\wind.xls'
df0 = pd.read_excel(xlsfile,0,index_col = None,na_values= ['9999'])
df1 = pd.read_excel(xlsfile,1,index_col = None,na_values= ['9999'])
#index_col拿出某列作为index
with pd.ExcelWriter('newxls.xls') as writer:
df0.to_excel(writer,sheet_name = str(0))
df1.to_excel(writer,sheet_name = str(1))
import pandas as pd
import xlrd
xlsfile = r'D:\workfile\uv\wind.xls'
book = xlrd.open_workbook(xlsfile)
#xlrd用于获取每个sheet的sheetname
#count = len(book.sheets())
with pd.ExcelWriter('newxls.xls') as writer:
for sheet in book.sheets():
print sheet.name
df = pd.read_excel(xlsfile,sheet.name,index_col = None,na_values= ['9999'])
df.to_excel(writer,sheet_name = sheet.name)
使用pandas读写Excel文件:
模块安装:
pip install openpyxl
模块openpyxl源于PHPExcel,它提供了针对.xlsx文件的读写功能
pip install xlsxwriter
模块也需要读取.xlsx文件
pip install xlrd
模块xlrd能用来析取.xls和.xlsx文件中的数据。下面,我们先来生成用于填充pandas中DataFrame的随机数,然后用这个DataFrame创建一个Excel文件,接着再用Excel文件重建DataFrame,并通过mean()方法来计算其平均值。对于Excel文件的工作表,我们既可以为其指定一个从0开始计数的索引,也可以为其规定一个名称。
import numpy as np
import pandas as pd
from tempfile import NamedTemporaryFile
np.random.seed(42)
a = np.random.randn(365,4)
tmpf = NamedTemporaryFile(suffix='.xlsx')
df = pd.DataFrame(a)
print tmpf.name
df.to_excel(tmpf.name,sheet_name='Random Data')
print "Means\n", pd.read_excel(tmpf.name, 'Random Data').mean()
通过to_excel()方法创建Excel文件,具体如下:
df.to_excel(tmpf.name,sheet_name='Random Data') 将DataFrame里的内容写入tmpf.name里,并把表取名为Random Data
下面使用顶级read_excel()函数来重建DataFrame,代码如下:
print "Means\n", pd.read_excel(tmpf.name, 'Random Data').mean() 读取tmpf.name里的Random Data表,并求每列的平均值
#coding:utf-8
import pandas as pd
import numpy as np
filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/1.xls"
#filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/26368f3a-ea03-46b9-8033-73615ed07816.xls"
df = pd.read_excel(filefullpath,skiprows=[0])
#df = pd.read_excel(filefullpath, sheetname=[0,2],skiprows=[0])
#sheetname指定为读取几个sheet,sheet数目从0开始
#如果sheetname=[0,2],那代表读取第0页和第2页的sheet
#skiprows=[0]代表读取跳过的行数第0行,不写代表不跳过标题
#df = pd.read_excel(filefullpath, sheetname=None ,skiprows=[0])
print df
print type(df)
#若果有多页,type(df)就为
#如果就一页,type(df)就为
#{0:dataframe,1:dataframe,2:dataframe}
pandas.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, thousands=None, convert_float=True, has_index_names=None, converters=None, engine=None, squeeze=False, **kwds)