如何在Pandas中获取 Dataframe 中的行号?

jgzswidk  于 2022-11-05  发布在  其他
关注(0)|答案(9)|浏览(647)

如何使用Pandas获取 Dataframe 中某列中包含某个值的行的编号?例如,我有以下 Dataframe :

ClientID  LastName
0    34        Johnson
1    67        Smith
2    53        Brows

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

0aydgbwb

0aydgbwb1#

  • 请注意, Dataframe 的索引可能是无序的,甚至根本不是数字。如果您不想使用当前索引,而是按顺序对行重新编号,那么您可以使用df.reset_index()以及下面的建议 *

若要取得符合'Smith'的所有索引

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

或作为numpy数组

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

或者如果只有一个并且您需要整数,则可以使用子集

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

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

de90aj5v

de90aj5v2#

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

或者

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

将返回LastName等于Smith的所有行索引

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

juud5qan3#

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.columns检查确切的名称。如果确实需要去除列名称中的所有白色,可以首先执行以下操作

df.columns = [x.strip().replace(' ', '') for x in df.columns]
n3ipq98p

n3ipq98p4#

len(df[df["Lastname"]=="Smith"].values)
slhcrj9b

slhcrj9b5#

count_smiths = (df['LastName'] == 'Smith').sum()
avwztpqn

avwztpqn6#

我知道这是很多年以后的事情了,但是不要在没有重新索引 Dataframe 的情况下尝试上面的解决方案。正如许多人已经指出的,在第一个问题中,你在 Dataframe 0,1,2左边看到的数字是该 Dataframe 内部的索引。当你用一个条件提取它的一个子集时,你可能会得到0,2或2,1,或2,1或2,1。0。因此,通过使用该数字(称为“索引”),您将不会获得该行在子集中的位置。您将获得该行在主 Dataframe 中的位置。
用途:

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

并使用字符串'Smith'来查看各种结果。其中将返回2个数组。第二个数组(索引为1)是您所关心的数组。
注意:当您搜寻的值不存在时,where()会在[1][0]上传回0。当是清单的第一个值时,它也会在[1][0]上传回0。请确定您先验证是否存在。
注#2:如果在[1]上的子集中多次出现与条件中相同的值,将查找包含所有出现位置的列表。如果需要,您可以使用[1]的长度进行将来的处理。

sgtfey8w

sgtfey8w7#

如果 Dataframe 的索引和行的序号不同,这里发布的大多数解决方案都将不再起作用。

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]
wdebmtf2

wdebmtf28#

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

输出

(1,1)
它表示1行1列。这样你就可以了解整个数据集
让我来解释一下上面的代码DataframeName[DataframeName['Column_name'] == 'Value to match in column']

s2j5cfk0

s2j5cfk09#

如果问题中的“行号”是指实际的行号/位置(而不是索引标签)
答案似乎是pandas.Index.get_loc(key, method=None, tolerance=None)(类似于:

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

目前的答案,除了一个,解释了如何获得索引标签,而不是行号。琐碎的代码与索引标签不对应的行号:
第一个

相关问题