從零開始學Pandas(三)-DataFrame API介紹2

備注: 本博客所有代碼可從如下github地址下載: https://github.com/Elliot518/data-science
注: 你需要自行安裝Python3和Jupyter開發(fā)環(huán)境

1. 創(chuàng)建DataFrame

我們知道,DataFrame可以從文件例如csv或excel讀取,也可以自己主動創(chuàng)建。
有幾種創(chuàng)建DataFrame的方式。

  • 方式1(推薦)
    通過平行的列表(list)進行創(chuàng)建

看下面的例子

fname = ['Paul', 'John', 'Richard', 'George']
lname = ['McCartney', 'Lennon', 'Starkey', 'Harrison']
birth = [1942, 1940, 1940, 1943]
people = {'first': fname, 'last': lname, 'birth': birth}
beatles = pd.DataFrame(people)
beatles

結(jié)果:


image.png

從上面的例子可以看出,我們通過元素相同的平行的list來創(chuàng)建DataFrame,其中每個list均代表了DataFrame中的一列。
因此,平行l(wèi)ist的方式是以列為維度來創(chuàng)建DataFrame的。它通過把每一列的數(shù)據(jù)創(chuàng)建出來。
(上面的例子中,'first','last','birth'就是列名)

DataFrame的索引(index)
默認index從0開始依次加1。
也可以自定義index,如下:

pd.DataFrame(people, index=["a", "b", "c", "d"])
image.png


  • 方式2
    通過字典(dictionary)創(chuàng)建。
    代碼如下:
pd.DataFrame(
[{"first":"Paul","last":"McCartney", "birth":1942},
 {"first":"John","last":"Lennon", "birth":1940},
 {"first":"Richard","last":"Starkey", "birth":1940},
 {"first":"George","last":"Harrison", "birth":1943}])
image.png

可以看到通過字典(dictionary)的方式創(chuàng)建會重復地寫列名,代碼會有很多冗余。

?

2. 自定義函數(shù)

可以在Series或DataFrame上應(yīng)用自定義函數(shù)。

  • Applying a function to a series
def MultiplyBy2(n):
    return n*2

adult_df.age.apply(MultiplyBy2)
image.png

?

3. 處理大數(shù)據(jù)集

Pandas是一個基于內(nèi)存的工具庫。對于處理超大數(shù)據(jù)集的時候,我們要防止內(nèi)存溢出的情況發(fā)生。
我們可以把數(shù)據(jù)分行讀取,如下:

large_dataset = pd.read_csv('large.csv', nrows=1000)

我們可以通過xxx_dataset.info()查看使用了多少內(nèi)存。
例如,我們可以看到1000行使用了78KB的內(nèi)存,那么我們可以預估,如果是10億的數(shù)據(jù)量將要消耗78GB的內(nèi)存。

也可以通過xxx_dataset.column_name.memory_usage()查看某一列使用了多少內(nèi)存。
單位為byte。

除了指定行數(shù)以外,我們還可以指定數(shù)據(jù)塊的大小,如下:

cols = ['carat', 'cut', 'color', 'clarity', 'depth', 'table', 'price']
diamonds_iter = pd.read_csv('../data/diamonds.csv', nrows=1000,
    dtype={'carat': np.float32, 'depth': np.float32,
           'table': np.float32, 'price': np.int16,
           'cut': 'category', 'color': 'category',
           'clarity': 'category'},
    usecols=cols,
    chunksize=200)

def process(df):
    return f'processed {df.size} items'

for chunk in diamonds_iter:
    print(process(chunk))

運行結(jié)果:
processed 1400 items
processed 1400 items
processed 1400 items
processed 1400 items
processed 1400 items

?

4. 寫文件

  • 寫入excel
import pandas as pd

data = [['Google', 10],['Runoob', 12],['Wiki', 13]]
df = pd.DataFrame(data, columns=['Site', 'Age'])
df

xl_writer = pd.ExcelWriter('../data/comp.xlsx')
df.to_excel(xl_writer, sheet_name='company')
xl_writer.save()

運行結(jié)果:
會新建一個comp.xlsx并把內(nèi)容寫入到該文件。

?

5. 讀取zip文件

當csv或excel文件很大的時候,我們可以壓縮一下文件,pandas有對應(yīng)的api進行讀取

  • 讀取包含單個文件的zip文件
# read zip file with single file
autos = pd.read_csv('../data/vehicles.csv.zip')
autos
image.png

默認時間格式

autos.modifiedOn
image.png

轉(zhuǎn)成日期格式

pd.to_datetime(autos.modifiedOn)
image.png

直接在加載時轉(zhuǎn)換格式

# convert date column during loading
autos = pd.read_csv('../data/vehicles.csv.zip', parse_dates=['modifiedOn'])
autos.modifiedOn
  • 讀取包含多個文件的zip文件
    當zip文件中包含多個文件的時候,我們需要用到python標準庫的zipfile模塊。

如下:

import zipfile

# read zip file containing multiple files
with zipfile.ZipFile('../data/kaggle-survey-2018.zip') as z:
    print('\n'.join(z.namelist()))
    kag = pd.read_csv(z.open('multipleChoiceResponses.csv'))
    kag_questions = kag.iloc[0]
    survey = kag.iloc[1:]
    print(kag_questions)
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容