pandas 數(shù)據(jù)索引與選取
我們對(duì) DataFrame 進(jìn)行選擇有鹿,大抵從這三個(gè)層次考慮:行列旭旭、區(qū)域、單元格印颤。
其對(duì)應(yīng)使用的方法如下:
一. 行您机,列 --> df[]
二. 區(qū)域 --> df.loc[], df.iloc[], df.ix[]
三. 單元格 --> df.at[], df.iat[]
下面開始練習(xí):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(6,4), index=list('abcdef'), columns=list('ABCD'))
- df[]:
一維
行維度:
整數(shù)切片、標(biāo)簽切片、<布爾數(shù)組>
列維度:
標(biāo)簽索引际看、標(biāo)簽列表咸产、Callable
df[:3]
df['a':'c']
df[[True,True,True,False,False,False]] # 前三行(布爾數(shù)組長(zhǎng)度等于行數(shù))
df[df['A']>0] # A列值大于0的行
df[(df['A']>0) | (df['B']>0)] # A列值大于0,或者B列大于0的行
df[(df['A']>0) & (df['C']>0)] # A列值大于0仲闽,并且C列大于0的行
df['A']
df[['A','B']]
df[lambda df: df.columns[0]] # Callable
- df.loc[]
二維脑溢,先行后列
行維度:
標(biāo)簽索引、標(biāo)簽切片赖欣、標(biāo)簽列表屑彻、<布爾數(shù)組>、Callable
列維度:
標(biāo)簽索引顶吮、標(biāo)簽切片社牲、標(biāo)簽列表、<布爾數(shù)組>悴了、Callable
df.loc['a', :]
df.loc['a':'d', :]
df.loc[['a','b','c'], :]
df.loc[[True,True,True,False,False,False], :] # 前三行(布爾數(shù)組長(zhǎng)度等于行數(shù))
df.loc[df['A']>0, :]
df.loc[df.loc[:,'A']>0, :]
df.loc[df.iloc[:,0]>0, :]
df.loc[lambda _df: _df.A > 0, :]
df.loc[:, 'A']
df.loc[:, 'A':'C']
df.loc[:, ['A','B','C']]
df.loc[:, [True,True,True,False]] # 前三列(布爾數(shù)組長(zhǎng)度等于行數(shù))
df.loc[:, df.loc['a']>0] # a行大于0的列
df.loc[:, df.iloc[0]>0] # 0行大于0的列
df.loc[:, lambda _df: ['A', 'B']]
df.A.loc[lambda s: s > 0]
- df.iloc[]
二維搏恤,先行后列
行維度:
整數(shù)索引、整數(shù)切片湃交、整數(shù)列表熟空、<布爾數(shù)組>
列維度:
整數(shù)索引、整數(shù)切片搞莺、整數(shù)列表息罗、<布爾數(shù)組>、Callable
df.iloc[3, :]
df.iloc[:3, :]
df.iloc[[0,2,4], :]
df.iloc[[True,True,True,False,False,False], :] # 前三行(布爾數(shù)組長(zhǎng)度等于行數(shù))
df.iloc[df['A']>0, :] #× 為什么不行呢才沧?想不通迈喉!
df.iloc[df.loc[:,'A']>0, :] #×
df.iloc[df.iloc[:,0]>0, :] #×
df.iloc[lambda _df: [0, 1], :]
df.iloc[:, 1]
df.iloc[:, 0:3]
df.iloc[:, [0,1,2]]
df.iloc[:, [True,True,True,False]] # 前三列(布爾數(shù)組長(zhǎng)度等于行數(shù))
df.iloc[:, df.loc['a']>0] #×
df.iloc[:, df.iloc[0]>0] #×
df.iloc[:, lambda _df: [0, 1]]
- df.ix[]
二維,先行后列
行維度:
整數(shù)索引温圆、整數(shù)切片弊添、整數(shù)列表、
標(biāo)簽索引捌木、標(biāo)簽切片油坝、標(biāo)簽列表、
<布爾數(shù)組>刨裆、
Callable
列維度:
整數(shù)索引澈圈、整數(shù)切片、整數(shù)列表帆啃、
標(biāo)簽索引瞬女、標(biāo)簽切片、標(biāo)簽列表努潘、
<布爾數(shù)組>诽偷、
Callable
df.ix[0, :]
df.ix[0:3, :]
df.ix[[0,1,2], :]
df.ix['a', :]
df.ix['a':'d', :]
df.ix[['a','b','c'], :]
df.ix[:, 0]
df.ix[:, 0:3]
df.ix[:, [0,1,2]]
df.ix[:, 'A']
df.ix[:, 'A':'C']
df.ix[:, ['A','B','C']]
- df.at[]
精確定位單元格
行維度:
標(biāo)簽索引
列維度:
標(biāo)簽索引
df.at['a', 'A']
- df.iat[]
精確定位單元格
行維度:
整數(shù)索引
列維度:
整數(shù)索引
df.iat[0, 0]
選取某一列
df['A']
選取某一行
df.loc['1']
刪除某一列
pd.drop('Part Number',axis=1)
刪除某兩行
pd.drop([11坤学,12],axis=0)
采用drop方法报慕,有下面三種等價(jià)的表達(dá)式:
- DF= DF.drop('column_name', 1)深浮;
- DF.drop('column_name',axis=1, inplace=True)
- DF.drop([DF.columns[[0,1, 3]]], axis=1,inplace=True) # Note: zero indexed
注意:凡是會(huì)對(duì)原數(shù)組作出修改并返回一個(gè)新數(shù)組的,往往都有一個(gè) inplace可選參數(shù)眠冈。如果手動(dòng)設(shè)定為True(默認(rèn)為False)飞苇,那么原數(shù)組直接就被替換。也就是說蜗顽,采用inplace=True之后布卡,原數(shù)組名(如2和3情況所示)對(duì)應(yīng)的內(nèi)存值直接改變;而采用inplace=False之后雇盖,原數(shù)組名對(duì)應(yīng)的內(nèi)存值并不改變堪藐,需要將新的結(jié)果賦給一個(gè)新的數(shù)組或者覆蓋原數(shù)組的內(nèi)存位置(如1情況所示)
合并兩個(gè)dataframe
pd.merge(df1,df2,how='left',on='Part Description')
插入一列
pd.insert(1,'e',df['a'])
插入在第1列(起始為0列疾层,列名為e召烂,列的內(nèi)容為df['a'])
dataframe 選取Nan 或者not Nan
productid_2=productid_1[productid_1['Product Code'].notnull()] #以該列非空值為條件捷凄,篩選整個(gè)dataframe
productid_2=productid_1[productid_1['Product Code'].isnull()] #以該列空值為條件,篩選整個(gè)dataframe