pandas索引 1 索引器

2021-10-12 14:52:09 字數 4912 閱讀 2722

#取單列

df.['列名']

df.列名

#取多列

df[['列名','列名']]

字串索引的series

s = pd.series([1, 2, 3, 4, 5, 6],

index=['a', 'b', 'a', 'a', 'a', 'c'])

#單列索引

s['a']

#多列索引

s[['c', 'b']]

#取出某兩個索引之間的元素

s['c','b':-2]

整數為索引的series

s = pd.series(['a', 'b', 'c', 'd', 'e', 'f'],

index=[1, 3, 1, 2, 5, 4])

s[1]

s[[2,3]]

#整數切片,不包含左右端點

s[1:-1:2]

loc索引器的一般形式是loc[*, *],其中第乙個*代表行的選擇,第二個*代表列的選擇,如果省略第二個位置寫作loc[*],這個*是指行的篩選。其中,*的位置一共有五類合法物件,分別是:單個元素、元素列表、元素切片、布林列表以及函式

先利用set_index方法把name列設為索引

df_demo = df.set_index('name')

df_demo.loc['qiang sun']

df_demo.loc['qiang sun', 'school'] # 返回series

之前的series使用字串索引時提到,如果是唯一值的起點和終點字元,那麼就可以使用切片,並且包含兩個端點

df_demo.loc['gaojuan you':'gaoqiang qian', 'school':'gender']
如果dataframe使用整數索引,其使用整數切片的時候和上面字串索引的要求一致,都是 元素 切片,包含端點且起點、終點不允許有重複值。

df_loc_slice_demo = df_demo.copy()

#設定索引值為行標的倒敘

df_loc_slice_demo.index = range(df_demo.shape[0],0,-1)

df_loc_slice_demo.loc[5:3]

df_loc_slice_demo.loc[3:5] # 沒有返回,說明不是整數字置切片

布林型別

例如,選出體重超過70kg的學生:

df_demo.loc[df_demo.weight>70].head()
通過isin方法返回的布林列表等價寫出

df_demo.loc[df_demo.grade.isin(['freshman', 'senior'])].head()
對於復合條件而言,可以用|(或), &(且), ~(取反)的組合來實現

例如選出復旦大學中體重超過70kg的大四學生,或者北大男生中體重超過80kg的非大四的學生:

condition_1_1 = df_demo.school == 'fudan university'

condition_1_2 = df_demo.grade == 'senior'

condition_1_3 = df_demo.weight > 70

condition_1 = condition_1_1 & condition_1_2 & condition_1_3

condition_2_1 = df_demo.school == 'peking university'

condition_2_2 = df_demo.grade == 'senior'

condition_2_3 = df_demo.weight > 80

condition_2 = condition_2_1 & (~condition_2_2) & condition_2_3

df_demo.loc[condition_1 | condition_2]

函式型別

def condition(x):

condition_1_1 = x.school == 'fudan university'

condition_1_2 = x.grade == 'senior'

condition_1_3 = x.weight > 70

condition_1 = condition_1_1 & condition_1_2 & condition_1_3

condition_2_1 = x.school == 'peking university'

condition_2_2 = x.grade == 'senior'

condition_2_3 = x.weight > 80

condition_2 = condition_2_1 & (~condition_2_2) & condition_2_3

result = condition_1 | condition_2

return result

df_demo.loc[condition]

lambda表示式

df_demo.loc[lambda x:'quan zhao', lambda x:'gender']
由於函式無法返回如start: end: step的切片形式,故返回切片時要用slice物件進行包裝

df_demo.loc[lambda x: slice('gaojuan you', 'gaoqiang qian')]
同樣也具有五種物件:整數、整數列表、整數切片、布林列表以及函式

df_demo.iloc[1, 1]

df_demo.iloc[[0, 1], [0, 1]]

df_demo.iloc[1: 4, 2:4]

df_demo.iloc[lambda x: slice(1, 4)]

使用布林列表的時候要特別注意,不能傳入series而必須傳入序列的values

df_demo.iloc[(df_demo.weight>80).values].head()
series

df_demo.school.iloc[1]

df_demo.school.iloc[1:5:2]

pandas中,支援把字串形式的查詢表示式傳入query方法來查詢資料,其表示式的執行結果必須返回布林列表。在進行複雜索引時,由於這種檢索方式無需像普通方法一樣重複使用dataframe的名字來引用列名,一般而言會使**長度在不降低可讀性的前提下有所減少。

df.query('((school == "fudan university")&'

' (grade == "senior")&'

' (weight > 70))|'

'((school == "peking university")&'

' (grade != "senior")&'

' (weight > 80))')

query表示式中,幫使用者註冊了所有來自dataframe的列名

df.query('weight > weight.mean()').head()
query中還註冊了若干英語的字面用法

df.query('(grade not in ["freshman", "sophomore"]) and'

'(gender == "male")').head()

==!=

df.query('grade == ["junior", "senior"]').head()
對於query中的字串,如果要引用外部變數,只需在變數名前加@符號

low, high =70, 80

df.query('weight.between(@low, @high)').head()

sample函式中的主要引數為n, axis, frac, replace, weights,前三個分別是指抽樣數量、抽樣的方向(0為行、1為列)和抽樣比例(0.3則為從總體中抽出30%的樣本)。

replaceweights分別是指是否放回和每個樣本的抽樣相對概率,當replace = true則表示有放回抽樣。例如,對下面構造的df_samplevalue值的相對大小為抽樣概率進行有放回抽樣,抽樣數量為3。

df_sample = pd.dataframe()

df_sample.sample(3, replace = true, weights = df_sample.value)

datawhale第十二期pandas

pandas索引物件

python for data analysis index物件是不可修改的 immutable 這樣才能使index物件在多個資料結構之間安全共享。in 1 import pandas as pd in 2 from pandas import series,dataframe in 3 impo...

pandas 索引切片

ser1 pd.series range 10,15 index list abcde print ser1 普通索引 print ser1 a print ser1 0 print 注意通過自定義索引的左閉右閉的,用預設索引 下標 是左閉右開的 print ser1 a c print ser1 ...

Pandas整數索引

在pandas上使用整數索引容易產生歧義,因為它和在列表 元組內構建資料結構進行索引有一點不同。1.整數索引 如下 ser pd.series np.arange 3.ser 1 返回的結果為 traceback most recent call last file g soft anaconda ...