pandas中Dataframe選取指定行和列或刪除含有指定數值的行或者列

pandas中的切片方法

[],loc,iloc,at,iat,ix
基礎數據

import pandas as pd
import random
random.seed(0)
rnd_1 = [random.randrange(1,20) for x in range(10)]
rnd_2 = [random.randrange(1,20) for x in range(10)]
rnd_3 = [random.randrange(1,20) for x in range(10)]
fecha = pd.date_range('2012-4-10', '2012-4-19')
data = pd.DataFrame({'fecha':fecha, 'rnd_1': rnd_1, 'rnd_2': rnd_2, 'rnd_3': rnd_3})
print(data)
print(data.describe())

結果:

       fecha  rnd_1  rnd_2  rnd_3
0 2012-04-10     13     19     10
1 2012-04-11     14      7      4
2 2012-04-12      2     17      3
3 2012-04-13      9      5     11
4 2012-04-14     17     10     16
5 2012-04-15     16      5     18
6 2012-04-16     13      4      4
7 2012-04-17     10      9     12
8 2012-04-18     16     18     14
9 2012-04-19     12      5     11
           rnd_1      rnd_2      rnd_3
count  10.000000  10.000000  10.000000
mean   12.200000   9.900000  10.300000
std     4.417138   5.915141   5.186521
min     2.000000   4.000000   3.000000
25%    10.500000   5.000000   5.500000
50%    13.000000   8.000000  11.000000
75%    15.500000  15.250000  13.500000
max    17.000000  19.000000  18.000000

[]切片方法

按照索引實現行選擇或列選擇或區塊選擇

print(data[1:5])   # 行選擇

       fecha  rnd_1  rnd_2  rnd_3
1 2012-04-11     14      7      4
2 2012-04-12      2     17      3
3 2012-04-13      9      5     11
4 2012-04-14     17     10     16

print(data[['rnd_1', 'rnd_2']])   # 列選擇

   rnd_1  rnd_2
0     13     19
1     14      7
2      2     17
3      9      5
4     17     10
5     16      5
6     13      4
7     10      9
8     16     18
9     12      5

 # 區塊選擇, 對於多列選擇,不能像行選擇時一樣使用1:5這樣的方法來選擇
print(data[:5][['rnd_1', 'rnd_2']]) 

   rnd_1  rnd_2
0     13     19
1     14      7
2      2     17
3      9      5
4     17     10

loc

loc可以按照索引來進行行列選擇,包含結尾

# 按照索引行選擇, loc與第一種方法不同之處在於會把第5行也選擇進去,而第一種方法只會選擇到第4行爲止。
print(data.loc[1:5])

       fecha  rnd_1  rnd_2  rnd_3
1 2012-04-11     14      7      4
2 2012-04-12      2     17      3
3 2012-04-13      9      5     11
4 2012-04-14     17     10     16
5 2012-04-15     16      5     18

# 區塊選擇
print(data.loc[2:4, ['rnd_2', 'fecha']])

   rnd_2      fecha
2     17 2012-04-12
3      5 2012-04-13
4     10 2012-04-14

loc能夠選擇在兩個特定日期之間的數據,這兩個日期必須都要在索引中

# 將行索引設定爲日期
data_fecha = data.set_index('fecha')
print(data_fecha.head())

            rnd_1  rnd_2  rnd_3
fecha                          
2012-04-10     13     19     10
2012-04-11     14      7      4
2012-04-12      2     17      3
2012-04-13      9      5     11
2012-04-14     17     10     16

# 生成兩個特定日期
from pandas import datetime
fecha_1 = datetime(2012, 4, 14)
fecha_2 = datetime(2012, 4, 18)

 # 生成切片數據
print(data_fecha.loc[fecha_1: fecha_2])

            rnd_1  rnd_2  rnd_3
fecha                          
2012-04-14     17     10     16
2012-04-15     16      5     18
2012-04-16     13      4      4
2012-04-17     10      9     12
2012-04-18     16     18     14

如果沒有特殊需求,強烈建議使用loc而儘量少使用[],因爲loc在對DataFrame進行重新賦值操作時會避免chained indexing問題,使用[]時編譯器很可能會給出SettingWithCopy的警告。

iloc

loc是按照索引(index)的值來選取,iloc是按照索引的位置來進行選取。iloc不關心索引的具體值是多少,只關心位置是多少,所以使用iloc時方括號中只能使用數值

# 行選擇
print(data_fecha.iloc[1: 5, :])

            rnd_1  rnd_2  rnd_3
fecha                          
2012-04-11     14      7      4
2012-04-12      2     17      3
2012-04-13      9      5     11
2012-04-14     17     10     16

# 列選擇
print(data_fecha.iloc[:,[1,2]].head())

            rnd_2  rnd_3
fecha                   
2012-04-10     19     10
2012-04-11      7      4
2012-04-12     17      3
2012-04-13      5     11
2012-04-14     10     16

# 切片選擇
print( data_fecha.iloc[[1,3,6],[0,2]])

            rnd_1  rnd_3
fecha                   
2012-04-11     14      4
2012-04-13      9     11
2012-04-16     13      4

at

at的使用方法與loc類似,但是比loc有更快的訪問數據的速度,只能訪問單個元素,不能訪問多個元素

iat

iat對於iloc的關係就像at對於loc的關係,是一種更快的基於索引位置的選擇方法,同at一樣只能訪問單個元素

ix

以上幾種方法都要求查詢的秩在索引中,或者位置不超過長度範圍,而ix允許你得到不在DataFrame索引中的數據。

選取或者刪除某列含有特殊數值的行

import pandas as pd
import numpy as np
 
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
df1=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC'))
print(df1)
df2=df1.copy()
 
#選取某列含有特定數值的行
# 選取df1中A列包含數字1的行
df1=df1[df1['A'].isin([1])]
#通過~取反,選取不包含數字1的行
df2=df2[~df2['A'].isin([1])]
print(df1)
print(df2)

結果:

      A  B  C
row0  1  2  3
row1  4  5  6
row2  7  8  9

      A  B  C
row0  1  2  3

      A  B  C
row1  4  5  6
row2  7  8  9

選取或者刪除某行含有特殊值的列

import pandas as pd
import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
df2 = pd.DataFrame(a, index=['row0', 'row1', 'row2'], columns=list('ABC'))
print(df2)
#選取某行含有特定數值的列
cols=[x for i,x in enumerate(df2.columns) if df2.iat[0,i]==3]
#利用enumerate對row0進行遍歷,將含有數字3的列放入cols中
print(cols)
 
#df2=df2[cols]   選取含有特定數值的列
df2=df2.drop(cols,axis=1) #利用drop方法將含有特定數值的列刪除
print(df2)

結果:

A  B  C
row0  1  2  3
row1  4  5  6
row2  7  8  9
['C']
      A  B
row0  1  2
row1  4  5
row2  7  8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章