当前位置:   article > 正文

pandas的dataframe行列索引方法与查询_dataframe索引

dataframe索引

行索引

dataframe的行索引方法有三种,分别为loc,iloc,ix

loc

loc是基于行索引(index),或者说是行的名称进行索引的。比如如果说有自己认为设置了索引的名称,在进行检索时使用loc,就只能输入行的名称。但是如果index是默认的递增数,那么和iloc没有区别。要注意此时如果使用切片索引,如[0:k]那么取的是index从0到k的k+1个行,而不是k-1行。

iloc

iloc是根据行的序列数索引的,序列数从0开始取,iloc前面的i就好像是在提醒你,他的输入参数是自然数。当然,在仅仅使用数字取列时,可以直接使用df[1]的方法。

ix

ix是前两者的混合,输入任何一种都可以。
这三种方式都支持对行列的检索和切片,组合起来可以有很丰富的用法。

列索引

dataframe的列索引比较简单一般可以使用df['cloumn']的方式解决。至于如何输出多个列的值,有以下的方法;

print(data[['A','B']])
  • 1

或者使用,这样可以取前400列。

data.iloc[:,0:400]
  • 1

查询方式

使用一些方法可使得dataframe的输出对象满足你的条件,一般我们想找满足条件的行中其他列的值。假设有两个列A和B,我们想知道满足A>5的行有哪些,就可以使用:

data[data["A"]>5]
  • 1

其中,data["A"]>5输出的是如下形式的bool变量组成的array,目的是为了说明那些行满足输入的条件。

0        True
1       False
2       False
3       False
  • 1
  • 2
  • 3
  • 4

如果我们的条件有很多个,要使用&、|、~来表示且、或、否,不能用and、or、not,并且如果条件带有比它们运算优先级第的符号,要用()隔开,如果不知道优先级就每个条件加一个(),如:

data[(data["A"]>5) & (data["B"] == 2)]
  • 1

如果说想输出满足条件行的另外一些列,结合之间的loc函数,可以有:

c = data.loc[(data["A"]>5) & (data["B"] == 2),"C"]
  • 1

此时输出的是series类型的值,如果想要得到其中的内容,可以使用:

c = c.values
  • 1

例子:下面的代码首先生成一个4*4的dataframe,然后输出A列大于5的所有行:

import pandas as pd
import numpy as np
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
print(data)
print(data[data.A > 5])
  • 1
  • 2
  • 3
  • 4
  • 5

结果为:

    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15

    A   B   C   D
c   8   9  10  11
d  12  13  14  15

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

当然你一可以采用更花哨的用法,比如找到某一列的最大的数:

print(data.loc[:,"A"].max())
  • 1

也可以用这种方法对这个最大数进行修改:

data.loc[df["A"]==df.loc[:,"A"].max(),"A"]  = 90
  • 1

即是loc中,前面的是对行的条件,后面是对列的条件。

更多用法

行与列的均值

在遍历时求某个数据所在的行和列的均值,可以使用

for index,row in data.iterrows():
    mean1 = data[data['number'] == row['number']].mean()#列均值
    mean2 = data[data['time'] == row['time']].mean()
    mean_row = row.mean()#行均值
  • 1
  • 2
  • 3
  • 4

通过dataframe某一行的最大值得到最大值的列名

思路是将dataframe的每一行变为单独的一行,此时的type为Series,原来的列名变为其索引index。如:

import pandas as pd
import numpy as np

# create a dataframe
table = pd.DataFrame(np.random.randn(3,2), index=["s1", "s2", "s3"], columns=["a1","a2"])

# 获得 s1 行
s1 = table.loc["s1",:]

# 获得 s1 中最大值的索引,可能有多个
s1_argmax = s1[s1 == s1.max()].index

# randomly choose 1 index
s1_argmax = np.random.choice(s1_argmax)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

上面你的代码以行s1为例得到了最大值的列名,我们还可以通过对dataframe行的遍历得到每一行的最大值的列名:

import pandas as pd
import numpy as np

# create a dataframe
table = pd.DataFrame(np.random.randn(3,2), index=["s1", "s2", "s3"], columns=["a1","a2"])
print(table)

for index,row in table.iterrows():
    temp = row[row == row.max()].index
    table.loc[index,'label'] = np.random.choice(temp)

print(table)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

或得输出:

          a1        a2
s1  0.263149  1.433578
s2 -0.081885  0.592749
s3 -0.808727  0.944126
          a1        a2 label
s1  0.263149  1.433578    a2
s2 -0.081885  0.592749    a2
s3 -0.808727  0.944126    a2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过isin批量筛选需要的数据行

data_problem = total_data[~total_data['name'].isin([0,5])]
  • 1

使用isin要注意:

  1. 可以使用~反函数取反得到条件相反的结果。
  2. 可以对dataframe的多个列使用isin来得到多种限制条件的结果。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/153120
推荐阅读
相关标签
  

闽ICP备14008679号