3 个回答
其实很简单,重点在于需要知道 pandas 里怎么做过滤。
举个例子,下面是一组人的年龄信息
df = pd.DataFrame({
"name":["john", "jack", "peter", "henry"],
"age": [25, 23, 22, 23]})
这个 df 打印出来是长这样的
name age
0 john 25
1 jack 23
2 peter 22
3 henry 23
现在我们要获取所有年龄23岁的人的行索引,应该怎么做呢?
首先过滤数据
df[df["age"]==23]
这行代码的作用是获取所有年龄是23的行,它的输出是这样的
name age
1 jack 23
3 henry 23
然后我们需要的是索引,获取索引可以访问 df 的 index 属性,如下
df[df["age"]==23].index
上面的代码输出
Int64Index([1, 3], dtype='int64')
可以看到,1和3正是所有年龄是23的人的行索引。
如果希望结果是一个列表,可以再调用一下 to_list() 函数
df[df["age"]==23].index.to_list()
输出
[1, 3]
在特征工程中,查找行的索引的必要性是很重要的。这些技能对于去除 Dataframe 中的离群值或异常值很有用。索引,也就是行标签,可以在 Pandas 中使用几个函数找到。
1.在 Pandas 中获取包含整数/浮点数的行的索引
pandas.DataFrame.loc函数可以通过其标签/名称访问行和列。它直接返回与作为标签传递的给定布尔条件相匹配的行。请注意片段中df.loc旁边的方括号。
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1,20,size=(20, 4)), columns=list('ABCD'))
print (df.loc[df['B'] == 19])
对应于布尔条件的行将以 Dataframe 格式的输出返回。
输出:
A B C D
6 1 19 4 18
9 12 19 3 1
多个条件可以被串联起来并一起应用到函数中,如下所示。这有助于根据特定条件隔离行。
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1,20,size=(20, 4)), columns=list('ABCD'))
print (df.loc[(df['B'] == 19) | (df['C'] == 19)])
输出:
A B C D
6 1 19 4 18
9 12 19 3 1
14 12 15 19 1
用 pandas.DataFrame.index() 获取行的索引
如果你想只查找满足作为参数传递的布尔条件的 DataFrame 的匹配索引,pandas.DataFrame.index() 是最简单的实现方式。
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1,20,size=(20, 4)), columns=list('ABCD'))
print (df.index[df['B'] == 19].tolist())
在上面的代码段中,列 A 中与布尔条件 ==1 相匹配的行以输出的方式返回,如下所示。
输出:
[6, 9]
我们之所以把 tolist() 放在 index() 方法后面,是为了把 Index 转换为列表,否则,结果就是 Int64Index 数据类型。
Int64Index([6, 9], dtype='int64'
也可以根据多个条件只检索索引。这段代码可以写成如下。
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(1,20,size=(20, 4)), columns=list('ABCD'))
print (df.index[(df['B'] == 19) | (df['C'] == 19)].tolist())
输出:
[6, 9, 14]
python基础知识资料分享给大家~~~ 获取方式:
【资料免费领】| 程序员必备指南+Python学习资料,0元抱走!
2.在 Pandas 中获取包含字符串的行的索引
字符串值可以根据两种方法进行匹配。上一节中所示的两种方法都可以使用,除了条件变化。
在下面的例子中,我们将使用以下片段。
import pandas as pd
df = pd.DataFrame({"Name": ["blue",
"delta",
"echo",
"charlie",
"alpha"],
"Type": ["Raptors",
"Raptors",
"Raptors",
"Raptors",
"Tyrannosaurus rex"]
print (df)
输出:
Name Type
0 blue Raptors
1 delta Raptors
2 echo Raptors
3 charlie Raptors
4 alpha Tyrannosaurus rex
用精确字符串匹配获取行的索引
上一节中使用的相等条件可以用来寻找 Dataframe 中的精确字符串匹配。我们来寻找两个字符串。
import pandas as pd
df = pd.DataFrame({"Name": ["blue",
"delta",
"echo",
"charlie",
"alpha"],
"Type": ["Raptors",
"Raptors",
"Raptors",
"Raptors",
"Tyrannosaurus rex"]
print (df.index[(df['Name'] == 'blue')].tolist())
print ('\n')
print (df.loc[df['Name'] == 'blue'])
print ('\n')
print (df.loc[(df['Name'] == 'charlie') & (df['Type'] =='Raptors')])
输出:
[0]
Name Type
0 blue Raptors
Name Type
3 charlie Raptors
如上所示,索引和符合条件的行都可以被接收。
获取具有部分字符串匹配条件的行的索引
通过将 DataFrame 与
str.contains
函数进行链式连接,可以部分匹配字符串值。在下面的例子中,我们将在 c
ha
rlie 和 alp
ha
中寻找字符串
ha
。
import pandas as pd
df = pd.DataFrame({"Name": ["blue",
"delta",
"echo",
"charlie",
"alpha"],
"Type": ["Raptors",
"Raptors",
"Raptors",
"Raptors",
"Tyrannosaurus rex"]
print (df.index[df['Name'].str.contains('ha')].tolist())
print ('\n')
print (df.loc[df['Name'].str.contains('ha')])
print ('\n')
print (df.loc[(df['Name'].str.contains('ha')) & (df['Type'].str.contains('Rex'))])
输出:
[3, 4]
Name Type