Python数据分析_Pandas04_本地数据的导入导出

主要内容:

  • 导入导出本地数据
    • pd.read_csv()
    • pd.to_csv()
    • pd.read_excel()
    • pd.read_pickle & pd.to_pickle

本地数据的IO操作

pandas可以很方便的读取/存储各种格式的本地文件,读取用read_xx(),写入用to_xx()

读取                            写入
read_csv                        to_csv
read_excel                      to_excel
read_hdf                        to_hdf
read_sql                        to_sql
read_json                       to_json
read_msgpack (experimental)     to_msgpack (experimental)                
read_html                       to_html
read_gbq (experimental)         to_gbq (experimental)            
read_stata                      to_stata
read_sas                        
read_clipboard                  to_clipboard    
read_pickle                     to_pickle

上面是官方文档列出来的用来读取数据的方法,支持好多格式的数据呢。有些我都没见过没听说,我有用到的有csv, excel, json, pickle等。它们的用法都差不多,而且特别简单。以read_csv()为主简单介绍一下pandas读取和存储数据的方法。

pd.read_csv()

基本用法

In [1]: import pandas as pd
In [4]: data = pd.read_csv('D:/test.csv')
In [5]: data.head()
Out[5]:
        Date      Open      High       Low     Close        Volume  Adj Close
0  2011/5/25  12355.45  12462.28  12271.90  12394.66  4.109670e+09   12394.66
1  2011/5/24  12381.87  12465.80  12315.42  12356.21  3.846250e+09   12356.21
2  2011/5/23  12511.29  12511.29  12292.49  12381.26  3.255580e+09   12381.26
3  2011/5/20  12604.64  12630.11  12453.96  12512.04  4.066020e+09   12512.04
4  2011/5/19  12561.46  12673.78  12506.67  12605.32  3.626110e+09   12605.32

什么参数都不设置的情况就是这样,读取进来之后是dataframe格式,自动生成数字索引。

它的参数特别多!!!

种种参数

  • filepath_or_buffer: 路径或文件,也可以是URL地址。
  • sepdelimiter:分隔符。默认是','逗号。
  • delim_whitespace:布尔型,默认False。决定是否将空格当做分隔符,相当于sep='\s+'。如果这里设置为True的话,delimiter就不要设置参数了。

列、列名和索引

  • header:设置作为列名的行,值可以是int或int组成的list,默认是'infer',如果names没有传参数,把第一行当做列名。如果设置为None,自动生成一组数字列名。

  • names:array-like,默认None。也是用来设置列名的,直接传一个字符串组成的矩阵形式的的参数。

  • index_col:设置index。可以是int或list(如果有多列索引用list),默认为None。

  • 还有其他呢,不常用不列举了。下面挨个试试。

    In [8]: data = pd.read_csv('D:/test.csv',header=None)
    
    In [9]: data.head(2)
    Out[9]:
               0         1         2        3         4           5          6
    0       Date      Open      High      Low     Close      Volume  Adj Close
    1  2011/5/25  12355.45  12462.28  12271.9  12394.66  4109670000   12394.66
    
    In [10]: data = pd.read_csv('D:/test.csv',names='abcdefg')
    
    In [11]: data.head(2)
    Out[11]:
               a         b         c        d         e           f          g
    0       Date      Open      High      Low     Close      Volume  Adj Close
    1  2011/5/25  12355.45  12462.28  12271.9  12394.66  4109670000   12394.66
    
    In [12]: data = pd.read_csv('D:/test.csv',index_col='Date')
    
    In [13]: data.head(2)
    Out[13]:
                   Open      High       Low     Close        Volume  Adj Close
    Date
    2011/5/25  12355.45  12462.28  12271.90  12394.66  4.109670e+09   12394.66
    2011/5/24  12381.87  12465.80  12315.42  12356.21  3.846250e+09   12356.21
    

时间数据处理

  • parse_dates:可以是布尔型、int、ints或列名组成的list、dict,默认为False。如果为True,解析index。如果为int或列名,尝试解析所指定的列。如果是一个多列组成list,尝试把这些列组合起来当做时间来解析。(敲厉害!!)

  • infer_datetime_format:布尔型。如果为True,而且也设置了parse_dates参数,可以提高速度。对于days开头的敏感。如果多列待解析的时间数据格式相同的话,这个可以大大提高解析速度。(我数据不多,感觉不出来。人家官方文档说了,反正启用了也不会有副作用。)

  • keep_date_col:布尔型,默认False。如果为Ture的话则保留原格式的时间列。

  • date_parser:设置解析时间数据所用的函数,一般按默认的走就好了。

    In [14]: data = pd.read_csv('D:/test.csv',index_col='Date',parse_dates=True)
    #注意Date那一列的格式变了,原来是字符串格式的,
    #现在变成了可以进行加减操作的日期格式。
    In [15]: data.head(2)
    Out[15]:
                    Open      High       Low     Close        Volume  Adj Close
    Date
    2011-05-25  12355.45  12462.28  12271.90  12394.66  4.109670e+09   12394.66
    2011-05-24  12381.87  12465.80  12315.42  12356.21  3.846250e+09   12356.21
    
    #这里从新读取一个CSV文件,前三列组成日期。
    In [21]: data2 = pd.read_csv('D:/test2.csv')
    
    In [22]: data2.head(2)
    Out[22]:
       Mon  Day  Year    gas  crude oil
    0    1    3  1997  22.90      1.225
    1    1   10  1997  23.56      1.241
    
    #解析之后
    In [23]: data2 = pd.read_csv('D:/test2.csv',
           : parse_dates={'date':[0,1,2]},
           : index_col='date')
           :
    In [24]: data2.head(2)
    Out[24]:
                  gas  crude oil
    date
    1997-01-03  22.90      1.225
    1997-01-10  23.56      1.241
    
    #保留原来的时间列
    In [27]: data2 = pd.read_csv('D:/test2.csv',parse_dates={'date':[0,1,2]},infer_datetime_format=True,keep_date_col=True,
        ...: index_col='date')
    
    In [28]: data2.head(2)
    Out[28]:
               Mon Day  Year    gas  crude oil
    date
    1997-01-03   1   3  1997  22.90      1.225
    1997-01-10   1  10  1997  23.56      1.241
    

啊,惊艳了时光!就问你棒不棒,棒 不 棒 !!

解析配置(好多的,我挑几个可能会用的)

  • dtype:设置数据类型,可以是类型名或{列名:类型名}组成的dict,默认None。
  • nrows:int,读取多少行。大文件读取片段时使用。
  • true_values false_values:被认为是True和False的值。
  • skiprows:int或列表形式,默认None。要跳过的行数,按索引(list),或者跳过头几行(int)。

空值和NA处理

  • na_values:增加被当做NA/NaN的值。默认情况下这些数据会被认为是NA值,'-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A', '#N/A', 'N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan', ''
  • keep_default_na:布尔型,默认True。如果值为False,而且na_values进行了设置,那么NA值会被重写,使用你设置的而不是上边所列出来的。
  • na_filter:布尔型,默认True。检测缺失值(空值和NA值)标记。如果文件没有NA值,设置na_filter=False可以提高读取大文件速度。
  • skip_blank_lines:布尔型,默认True。跳过空行,而不是解析为NA值。

啊,还有引用、注释、字符格式等等参数,一般不会到那么细枝末节的地步,不说了。

read_csv()read_table()几乎相等,不单单可以读取以逗号分割的CSV格式,你可以通过设置sep参数让它读取各种不同分割符号的文本文件等等。

可用参数是很多,但这个方法用起来很简单。唯一一个必须的参数就是需要读取文件的路径/地址。写入和读取类似,用法都一样。
下面的几个方法我就不再解释参数,其实都类似的,直接举几个例子看看好了。

pd.to_csv()

In [2]: import pandas as pd
      : data = pd.read_csv('D:/test.csv',index_col='Date',parse_dates=True)
      :
      
In [5]: data[:5]
Out[5]:
                Open      High       Low     Close        Volume  Adj Close
Date
2011-05-25  12355.45  12462.28  12271.90  12394.66  4.109670e+09   12394.66
2011-05-24  12381.87  12465.80  12315.42  12356.21  3.846250e+09   12356.21
2011-05-23  12511.29  12511.29  12292.49  12381.26  3.255580e+09   12381.26
2011-05-20  12604.64  12630.11  12453.96  12512.04  4.066020e+09   12512.04
2011-05-19  12561.46  12673.78  12506.67  12605.32  3.626110e+09   12605.32

#把data中Open和Close列的前五行写入to.csv文件中。
In [9]: data[:5].to_csv('D:/to.csv', columns=['Open','Close'])

In [10]: data2 = pd.read_csv('D:/to.csv')
#把刚生成的to.csv再读进来看看对不对。

In [11]: data2
Out[11]:
         Date      Open     Close
0  2011-05-25  12355.45  12394.66
1  2011-05-24  12381.87  12356.21
2  2011-05-23  12511.29  12381.26
3  2011-05-20  12604.64  12512.04
4  2011-05-19  12561.46  12605.32

pd.read_excel()

In [19]: excel = pd.read_excel('D:/test.xlsx', sheetname='Sheet1')

In [20]: excel.head(2)
Out[20]:
   Month  Day  Year    gas  crude oil
0      1    3  1997  22.90      1.225
1      1   10  1997  23.56      1.241

In [21]: excel['Date']=pd.to_datetime(excel[['Year','Month','Day']])

In [22]: excel = excel.set_index("Date")

In [23]: excel.head(2)
Out[23]:
            Month  Day  Year    gas  crude oil
Date
1997-01-03      1    3  1997  22.90      1.225
1997-01-10      1   10  1997  23.56      1.241

pd.read_pickle & pd.to_pickle

pickle这个用起来特别简单,根本就没有其他参数。它比较特殊的是可以实现将数据或对象序列化为字节流,pickling也就是保存为二进制数,unpickling就是相反的过程。pickle的意思是泡菜,把数据泡起来之后就可以长久存放不容易变质,pickle被当做永久储存数据的一个方法。

我见过用pickle保存数据是在机器学习中。把训练好的模型存成pickle文件,下次使用这个模型的时候直接读取pickle文件,而不需要再次训练。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容