溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現pandas DataFrame數據選取,修改,切片

發(fā)布時間:2020-07-31 09:50:42 來源:億速云 閱讀:579 作者:小豬 欄目:開發(fā)技術

這篇文章主要為大家展示了如何實現pandas DataFrame數據選取,修改,切片,內容簡而易懂,希望大家可以學習一下,學習完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

在剛開始使用pandas DataFrame的時候,對于數據的選取,修改和切片經常困惑,這里總結了一些常用的操作。

pandas主要提供了三種屬性用來選取行/列數據:

屬性名屬性
ix根據整數索引或者行標簽選取數據
iloc根據位置的整數索引選取數據
loc根據行標簽選取數據

先初始化一個DateFrame做例子

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'])

df是這樣的

In [35]: df
Out[35]: 
   name  gender age
0  Snow   M    22
1  Tyrion  M    32
2  Sansa  F    18
3  Arya   F    14

如果每列都有column name,比如這里是: 

In [42]: df.columns
Out[42]: Index(['name', 'gender', 'age'], dtype='object')

1. 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)

2. loc,在知道列名字的情況下,df.loc[index,column] 選取指定行,列的數據

loc也提供了五種參數形式

inputexample(摘自官方文檔)output
行標簽df.loc[‘viper']選取viper那一行
行標簽數組df.loc[[‘viper', ‘sidewinder']]選取行標簽為viper、sidewinder
行標簽切片df.loc[‘cobra':‘viper', ‘max_speed']選取從cobra到viper行的max_speed列
布爾值數組df.loc[[False, False, True]]
函數df.loc[df[‘shield'] > 6, [‘max_speed']]選取shield列大于6的那一行的max_speed數據

注意 df.loc[df[‘one']>10]這樣的寫法是可以正常選出one列大于10的數據

# 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列的數據

3. iloc,在column name特別長或者index是時間序列等各種不方便輸入的情況下,可以用iloc (i = index), iloc完全用數字來定位 iloc[row_index, column_index]

iloc提供了五種參數形式

inputexampleoutput
整數(行索引)df.iloc[5]選取第6行數據
整數數組df.iloc[[1,3,5]]選取第2,4,6行數據
整數切片df.iloc[1:3]選取2~4行數據(不包含第4行數據)
布爾值數組df.iloc[[True,False,True]選取第1,3行數據
函數df.iloc[(df[‘one']>10).tolist()]選取'one'這列大于10的那一行數據

注意:iloc接受有返回值的函數作為參數,但要保證函數返回的是整數/整數list,布爾值/布爾list

如果直接運行 df.iloc[df[‘one']>10]

則會報錯 NotImplementedError: iLocation based boolean indexing on an integer type is not available

因為df[‘one'] > 10 返回的是 series類型的數據

除此之外,還可以進行組合切片

inputexampleoutput
整數(行索引)df.iloc[5,1]選取第6行,第2列的數據
整數數組df.iloc[[1,3],[1,2]]選取第2,4行;2,3列的數據
整數切片df.iloc[1:3,1:3]選取第2,3行;2,3列的數據
布爾值數組df.iloc[[True,True,False],[True,False,True]]選取第1,2行;1,3列的數據

要注意的是,我們用df[參數]也可以進行切片,但這種方式容易引起chained indexing 問題。除此之外,**df[lable1][lable2]**的操作是線性的,對lable2的選取是在df[lable1]的基礎上進行,速度相對較慢。所以在對數據進行切片的時候盡量使用iloc這類的方法

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列的數據

4. 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 DataFrame數據選取,修改,切片的內容,如果你們有學習到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI