如何在熊猫数据框中获取行号?

我如何使用熊猫得到一个数据框架中包含某一列中的某个值的行数?例如,我有以下数据框:

     ClientID  LastName
0    34        Johnson
1    67        Smith
2    53        Brows

如何找到“姓氏”列中包含“ Smith”的行号?

273966 次浏览

注意,数据框架的索引可能是无序的,甚至根本没有数值。如果不想使用当前索引,而是按顺序重新编号行,那么可以使用 df.reset_index()和下面的建议一起使用

获取所有与“ Smith”匹配的索引

>>> df[df['LastName'] == 'Smith'].index
Int64Index([1], dtype='int64')

或者作为一个数字数组

>>> df[df['LastName'] == 'Smith'].index.to_numpy()  # .values on older versions
array([1])

或者如果只有一个整数,你想要整数,你可以子集

>>> df[df['LastName'] == 'Smith'].index[0]
1

对于 .loc,您可以使用相同的布尔表达式,但是除非您还想选择某个列,否则不需要使用这个布尔表达式,当您只想要行号/索引时,选择某个列是多余的。

df.index[df.LastName == 'Smith']

或者

df.query('LastName == "Smith"').index

将返回 LastNameSmith的所有行索引

Int64Index([1], dtype='int64')
df.loc[df.LastName == 'Smith']

将返回行

    ClientID    LastName
1   67          Smith

还有

df.loc[df.LastName == 'Smith'].index

将返回索引

Int64Index([1], dtype='int64')

注意: 列名‘ LastName’和‘ Last Name’甚至‘ LastName’是三个唯一的名称。最佳实践是首先使用 df.column 检查确切的名称。如果确实需要去掉所有空格的列名,可以首先这样做

df.columns = [x.strip().replace(' ', '') for x in df.columns]
count_smiths = (df['LastName'] == 'Smith').sum()
 len(df[df["Lastname"]=="Smith"].values)

您可以简单地使用形状方法 df[df['LastName'] == 'Smith'].shape

输出
(1,1)

它指示1行和1列。这样您就可以得到整个数据集的概念

让我解释一下上面的代码 DataframeName[DataframeName['Column_name'] == 'Value to match in column']

我知道这是许多年后,但不要尝试上述解决方案没有重新索引您的数据框架第一。正如许多人已经指出的那样,在最初的问题中,数据框0、1、2左边的数字是该数据框的索引 INSIDE。当您使用条件提取它的子集时,您可能会得到0、2或2、1或2、1或2、1、0,这取决于您的条件。因此,通过使用这个数字(称为“ index”) ,您不会得到行在子集中的位置。您将得到该行在主数据框中的位置。

用途:

np.where([df['LastName'] == 'Smith'])[1][0]

然后玩“史密斯”这根弦,看看各种结果。其中将返回2个数组。第二个(索引1)是你关心的。

注意: 当您搜索的值不存在时,其中()将在[1][0]上返回0。当是列表的第一个值时,它也将在[1][0]上返回0。确保您首先验证了存在。

注意2: 如果在[1]上的子集中多次出现与您的条件相同的值,那么将找到具有所有出现的位置的列表。如果需要,您可以使用[1]的长度来进行以后的处理。

如果数据框架的索引和行的序号不同,那么这里提供的大多数解决方案将不再有效。给定带有 按字母顺序索引的数据框架:

In [2]: df = pd.DataFrame({"ClientID": {"A": 34, "B": 67, "C": 53}, "LastName": {"A": "Johnson", "B": "Smith", "C": "Brows"}})


In [3]: df
Out[3]:
ClientID LastName
A        34  Johnson
B        67    Smith
C        53    Brows

您必须使用 get_loc来访问序号行号:

In [4]: df.index.get_loc(df.query('LastName == "Smith"').index[0])
Out[4]: 1

如果条件所在的行可能存在多个,例如,在 LastName列中查找有‘ Smith’或者‘ Brows’的序列行号,则可以使用 列表理解法:

In [5]: [df.index.get_loc(idx) for idx in df.query('LastName == "Smith" | LastName == "Brows"').index]
Out[5]: [1, 2]

如果问题中的“行号”表示实际的行号/位置(而不是索引标签)
Get _ loc (关键字,方法 = 无,容忍度 = 无) 似乎是答案:

row_number = df.index.get_loc(df.query(f'numbers == {m}').index[0])

当前的答案(除了一个)解释了如何获取索引标签而不是行号。 索引标签与行号不对应的简单代码:

import pandas as pd


n = 3; m = n-1


df = pd.DataFrame({'numbers' : range(n) },
index = range(n-1,-1,-1))
print(df,"\n")


label =      df[df['numbers'] == m].index[0]
row_number = df.index.get_loc(df.query(f'numbers == {m}').index[0])


print(f'index label: {label}\nrow number:  {row_number}',"\n")
print(f"df.loc[{label},'numbers']: {df.loc[label, 'numbers']}")
print(f"df.iloc[{row_number}, 0]:       {df.iloc[row_number, 0]}")
   numbers
2        0
1        1
0        2


index label: 0
row number:  2


df.loc[0,'numbers']: 2
df.iloc[2, 0]:       2
  1. 获取单个匹配项的精确行数

row-number = df[df["LastName" == 'Smith']].index[0]

  1. 得到“史密斯”多次出现的准确行数

row-number = df[df["LastName" == 'Smith']].index.tolist()