Pandas簡易入門(四)


本節主要介紹一下Pandas的另一個數據結構:DataFrame,本文的內容來源:https://www.dataquest.io/mission/147/pandas-internals-dataframes

在上一節中已經介紹過了Series對象,Series對象可以理解為由一列索引和一列值,共兩列數據組成的結構。而DataFrame就是由一列索引和多列值組成的結構,其中,在DataFrame中的每一列都是一個Series對象。

 

行選擇

不管何時,你調用了一個方法返回或者打印一個DataFrame時,最左邊的一列必然是索引值,可以通過index屬性來直接訪問DataFrame的索引值,本節所用的數據來源於:https://github.com/fivethirtyeight/data/tree/master/fandango

import pandas as pd

fandango = pd.read_csv('fandango_score_comparison.csv')

# print(fandango.head(2))  輸出前兩行

print(fandango.index)  # 打印索引列的值

Image 001

這是原始的數據:

Image 003

 

在Series中,每一個索引都對應着一個值,在DataFrame中,每一個索引則對應着一行的數據,可以通過幾種方法來選擇多數據

# 選擇前五行

fandango[0:5]

# 選擇索引號140及其以后的行

fandango[140:]

# 只選擇索引號為50的那一行

fandango.loc[50]

# 選擇索引號為45和90的兩行

fandango.loc[[45,90]]

總結:要選擇連續的多行,就是用列表的切片功能,選擇一行就是用loc[]方法或者iloc[]方法(二者的區別可以看我的另一篇博客“Pandas之讓人容易混淆的行選擇和列選擇“)

當選擇一行的數據時,Pandas會返回一個Series對象,當選擇多行數據時,會返回一個DataFrame對象

 

自定義索引

Pandas可以使用某一列來重新自定義DataFrame的索引,通過set_index()方法來實現,該方法主要有兩個參數:

  • inplace,如果設置為True就不會返回一個新的DataFrame,而是直接修改該DataFrame
  • drop,如果設置為True,就會移出掉該列的數據
# 我要把電影名稱作為該DataFrame的索引

fandango = pd.read_csv('fandango_score_comparison.csv')

fandango_films = fandango.set_index('FILM', inplace=False, drop=True)

Image 002

可以看到索引值已經變了,並且該DataFrame中也移除了名為FILM的列(該列變成了索引)

使用了自定義的索引后,類似於之前的行選擇一樣進行選擇,只是把整數索引換成了電影名稱而已,例如

# 使用切片或者loc[]函數

fandango_films["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]

fandango_films.loc["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]

# 指定要返回的電影

fandango_films.loc['Kumiko, The Treasure Hunter (2015)']

# 選擇要返回的多部電影

movies = ['Kumiko, The Treasure Hunter (2015)', 'Do You Believe? (2015)', 'Ant-Man (2015)']

fandango_films.loc[movies]

 

 

Apply方法

apply()方法是運行在Series對象中的,而Pandas中任何單獨一列或者單獨一行的數據就是一個Series對象,apply()方法中要傳遞的是一個向量運算方法

如果該方法返回一個單獨的值(譬如將整列(行)的值相加),那么就會返回一個Series,該Series保存的是全部列的運行結果,如下

import numpy as np

# 得出每一列的數據類型

types = fandango_films.dtypes

# 選擇具有浮點數據的那些列

float_columns = types[types.values == 'float64'].index

float_df = fandango_films[float_columns]

Image 009

# 對選擇的列計算總分,在lambda中的x是一個Series,代表了某一列

count = float_df.apply(lambda x: np.sum(x))

Image 008

如果該方法沒有合並運算結果(譬如將整列(行)的值都分別乘2),那么就會返回一個DataFrame。如下

double_df = float_df.apply(lambda x: x*2)

Image 007

 

如果要在行上使用apply()方法,只要指定參數axis = 1即可

# 計算每部電影的平均分

means = float_df.apply(lambda x: np.mean(x), axis = 1)

Image 010


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM