【3.2.1】Pandas--Dataframe信息提取
(有需求,找)官网:http://pandas.pydata.org/pandas-docs/stable/indexing.html
搭建测试数据:
import numpy as np
import pandas as pd
from pandas import Sereis, DataFrame
ser = Series(np.arange(3.))
data = DataFrame(np.arange(15).reshape(3,5),index=['one','two','three'],columns=['a','b','c','d','e'])
print data
输出:
Out[7]:
a b c d e
one 0 1 2 3 4
two 5 6 7 8 9
three 10 11 12 13 14
一、常用的处理方法:
1.列名
data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型
data.w #选择表格中的'w'列,使用点属性,返回的是Series类型
data[['w']] #选择表格中的'w'列,返回的是DataFrame属性
data[['w','z']] #选择表格中的'w'、'z'列
data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame, #即末端是包含的
data['one':'two'] #当用已知的行索引时为前闭后闭区间,这点与切片稍有不同。
2.行的编号
data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后
data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,
#如果采用data[1]则报错
data[-1:] #跟上面一样,取DataFrame中最后一行,返回的是DataFrame类型
4.irow或icol
data.irow(0) #取data的第一行
data.icol(0) #取data的第一列
5.head和tail
data.head() #返回data的前几行数据,默认为前五行,需要前十行则dta.head(10)
data.tail() #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)
6.iget_value
ser.iget_value(0) #选取ser序列中的第一个
ser.iget_value(-1) #选取ser序列中的最后一个,这种轴索引包含索引器的series不能采用ser[-1]去获取最后一个,这回引起歧义。
7.iloc
data.iloc[-1] #选取DataFrame最后一行,返回的是Series
data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame
8.loc
data.loc['a',['w','x']] #返回‘a’行'w'、'x'列,这种用于选取行索引列索引已知
9.iat
data.iat[1,1] #选取第二行第二列,用于已知行、列位置的选取。
二、提取指定的列
数据框
index a b c
1 2 3 4
2 3 4 5
提取b,c列
#方法一:
df1 = df[['a','b']]
#方法二:
df1 = df.iloc[0,0:2].copy() # To avoid the case where changing df1 also changes df
三、数据的筛选
3.1 pandas多条件行数据筛选
& 代表和, | 代表或
print df[(df['PCTL']<0.95) & (df['PCTL']>0.05)]
print df[(df['PCTL']<0.95) | (df['PCTL']>0.05)]
如果是要对element-wise作判断,考虑用df.map
如果是运算考虑用df.apply + lambda
3.2 删除数据
删除/选取某列含有特殊数值的行
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=df1[df1['A'].isin([1])]
#df1[df1['A'].isin([1])] 选取df1中A列包含数字1的行
df1=df1[~df1['A'].isin([1])]
#通过~取反,选取不包含数字1的行
print(df1)
删除/选取某行含有特殊数值的列
#删除/选取某行含有特定数值的列
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)
删除含有空值的行或列
import pandas as pd
import numpy as np
df1 = pd.DataFrame(
[
[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]
],columns=list('ABCD'))
print(df1)
df2=df1.copy()
df1['A']=df1['A'].fillna('null') #将df中A列所有空值赋值为'null'
print(df1)
df1=df1[~df1['A'].isin(['null'])]
print(df1)
#删除某行空值所在列
df2[0:1]=df2[0:1].fillna('null')
print(df2)
cols=[x for i,x in enumerate(df2.columns) if df2.iat[0,i]=='null']
print(cols)
df2=df2.drop(cols,axis=1)
print(df2)
3.2 获取行最大值以及索引
例如在对模型得到类别的概率值按行取最大值,并将最大值所在的列单独放一列。
array
array([[ 0.47288769, 0.23982215, 0.2261405 , 0.06114962],
[ 0.67969596, 0.11435176, 0.17647322, 0.02947907],
[ 0.00621393, 0.01652142, 0.31117165, 0.66609299],
[ 0.24093366, 0.23636758, 0.30113828, 0.22156043],
[ 0.44093642, 0.2245989 , 0.24515967, 0.08930501],
[ 0.05540339, 0.10013942, 0.30361843, 0.54083872],
[ 0.11221886, 0.75674808, 0.09237131, 0.03866173],
[ 0.24885316, 0.28243011, 0.28312165, 0.18559511],
[ 0.01205211, 0.03740638, 0.271065 , 0.67947656]], dtype=float32)
想在想实现的功能是在上述DataFrame后面增加两列:一列是最大值,一列是最大值所在的行索引。
首先先来了解一下argmax函数。
argmax(a, axis=None)
- a 表示DataFrame
- axis 表示指定的轴,默认是None,表示把array平铺,等于1表示按行,等于0表示按列。
对于DataFrame来说,求解过程如下:
#导入库
import pandas as pd
import numpy as np
#将array转化为DataFrame
arr=pd.DataFrame(array,columns=["one","two","three","four"])
#分别求行最大值及最大值所在索引
arr['max_value']=arr.max(axis=1)
arr['max_index']=np.argmax(array,axis=1)
#得出如下结果:
arr
Out[28]:
one two three four max_index max_value
0 0.472888 0.239822 0.226140 0.061150 0 0.472888
1 0.679696 0.114352 0.176473 0.029479 0 0.679696
2 0.006214 0.016521 0.311172 0.666093 3 3.000000
3 0.240934 0.236368 0.301138 0.221560 2 2.000000
4 0.440936 0.224599 0.245160 0.089305 0 0.440936
5 0.055403 0.100139 0.303618 0.540839 3 3.000000
6 0.112219 0.756748 0.092371 0.038662 1 1.000000
7 0.248853 0.282430 0.283122 0.185595 2 2.000000
8 0.012052 0.037406 0.271065 0.679477 3 3.000000
假如现在要找出行第二大的值及其索引时,该怎么操作呢:
解决思路:可以将行的最大值置为0,然后在寻找每行的最大值及其索引。
具体代码实现过程如下:
#将最大值置为0
array[arr.index,np.argmax(array,axis=1)]=0
array
array([[ 0. , 0.23982215, 0.2261405 , 0.06114962],
[ 0. , 0.11435176, 0.17647322, 0.02947907],
[ 0.00621393, 0.01652142, 0.31117165, 0. ],
[ 0.24093366, 0.23636758, 0. , 0.22156043],
[ 0. , 0.2245989 , 0.24515967, 0.08930501],
[ 0.05540339, 0.10013942, 0.30361843, 0. ],
[ 0.11221886, 0. , 0.09237131, 0.03866173],
[ 0.24885316, 0.28243011, 0. , 0.18559511],
[ 0.01205211, 0.03740638, 0.271065 , 0. ]], dtype=float32)
#取出第二大值及其索引
arr['second_value']=array.max(axis=1)
arr['second_index']=np.argmax(array,axis=1)
arr
Out[208]:
one two three four max_value max_index second_value \
0 0.472888 0.239822 0.226140 0.061150 0.472888 0 0.239822
1 0.679696 0.114352 0.176473 0.029479 0.679696 0 0.176473
2 0.006214 0.016521 0.311172 0.666093 0.666093 3 0.311172
3 0.240934 0.236368 0.301138 0.221560 0.301138 2 0.240934
4 0.440936 0.224599 0.245160 0.089305 0.440936 0 0.245160
5 0.055403 0.100139 0.303618 0.540839 0.540839 3 0.303618
6 0.112219 0.756748 0.092371 0.038662 0.756748 1 0.112219
7 0.248853 0.282430 0.283122 0.185595 0.283122 2 0.282430
8 0.012052 0.037406 0.271065 0.679477 0.679477 3 0.271065
second_index
0 1
1 2
2 2
3 0
4 2
5 2
6 0
7 1
8 2
讨论
- ix函数已经被丢弃
参考资料
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn