从列中搜索行(而不是 |)上的一组值
Posted
技术标签:
【中文标题】从列中搜索行(而不是 |)上的一组值【英文标题】:search for a set of values on rows (& not |) from a column 【发布时间】:2019-04-26 18:54:34 【问题描述】:我是 python 新手,我正在尝试从第一列中找到第二列中包含我正在搜索的所有条目的条目。例如:我想要条目 155, 137 并且我希望从 id1 列中获得 5 和 6 作为回报。
id1 id2
----------
1. 10
2. 10
3. 10
4. 9
5. 137
5. 150
5. 155
6. 10
6. 137
6. 155
....
我在谷歌上搜索了很多,但无法解决。我从 excel 中读取了这些条目,我尝试了多个 for 循环,但它看起来不太好,因为我正在搜索很多条目
我试过这个:
df = pd.read_excel('path/temp.xlsx') #now I have two Columns and many rows
d1 = df.values.T[0].tolist()
d2 = df.values.T[1].tolist()
d1[d2.index(115) & d2.index(187)& d2.index(276) & d2.index(239) & d2.index(200) & d2.index(24) & d2.index(83)]
它返回 1
我这周开始工作,所以我很新
【问题讨论】:
【参考方案1】:假设您对两个 ID 都有两个列表(即一个列表用于 id1,一个用于 id2),并且这些列表相互对应(也就是说,list1 中索引 i
处的值对应于列表2的索引i
)。
如果是您的情况,那么您只需找出要搜索的元素的索引,另一个列表中的相应索引将是您查询的答案。
要获取元素的索引,可以使用Python的内置特性来获取索引,即:
list.index(<element>)
它将返回列表中您想要的元素的从零开始的索引。
要从id1中获取对应的ID,可以简单的使用这个索引(因为是一一对应的)。在你的情况下,它可以写成:
id1[id2.index(137)] #it will return 5
注意:
index()
方法将返回列表中第一个匹配条目的索引。
【讨论】:
我需要返回第一列中的所有 ID,其中包含我在第二列中搜索的所有元素。我尝试将原始 excel 表中的两个读取列转换为两个列表,然后使用 id1[id2.index(137) & id2.index(138) & ...] 但它只返回“1” 如果您喜欢在 Pandas 中工作,那么另一个答案将非常适合/易于实施。否则,您可能可以更新问题并添加返回 1 的代码。我很乐意对其进行审核。【参考方案2】:最好使用熊猫
import pandas as pd
import numpy as np
随机数据
n = 10
I = [i for i in range(1,7)]
df1 = pd.DataFrame('Id1': [Id[np.random.randint(len(I))] for i in range(n)],
'Id2': np.random.randint(0,1000,n))
df1.head(5)
Id1 Id2
0 4 170
1 6 170
2 6 479
3 4 413
4 6 52
查询使用
df1.loc[~df1.Id2.isin([170,479])].Id1
Out[344]:
3 4
4 6
5 6
6 3
7 1
8 5
9 6
Name: Id1, dtype: int64
【讨论】:
当我从一个有两列的 excel 表开始时,我是否需要将它们转换为两个列表,然后再次加入它们才能使用这个 df1.loc[~df1.Id2.isin([ 170,479])].Id1? @cribb 不。你只需写df1 = pd.read_csv('C:\file.csv')
而不是df1 = pd.DataFrame(...
,因为这只是我制作的随机数据(我很懒,不想复制你的例子)。 'C:\folder\file.csv' 只是通用的,将其替换为您的文件路径并使用 \ 或 // 至于您可以在代码之外声明的列表 [170,479]
@cribb 此外,该文件不必位于 C 驱动器中。我建议你坚持使用 .csv 作为你的 excel【参考方案3】:
目前,我已经通过这样做解决了它
【讨论】:
以上是关于从列中搜索行(而不是 |)上的一组值的主要内容,如果未能解决你的问题,请参考以下文章
需要使用 pandas.str() 使用字符串列表从列中选择值 [重复]