Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1649519
  • 博文数量: 631
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3920
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(631)

文章存档

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2018-02-02 15:13:08

在使用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省略号.PNG
中间多了个省略号,就是中间若干的数据因为太多而没有被显示。 那么要怎样才能正常显示所有数据呢???
 
查看了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)









阅读(1762) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~