自动查找列表项的索引,该列表项包含在每一行的特定 pandas 列中

Posted

技术标签:

【中文标题】自动查找列表项的索引,该列表项包含在每一行的特定 pandas 列中【英文标题】:Find automatically the index of a list item which is contained in a specific pandas column for each row 【发布时间】:2019-10-24 03:40:14 【问题描述】:

我试图自动查找而不使用列表项的索引,该列表项包含在每行的特定熊猫列中。

想象一下,我有一个包含 names = ["U9", "Z9", "H10"] 的列表和一个带有包含以下内容的列的 pandas 数据框

dat['col1'] = ["U9", "U9", "U9", "Z9", "Z9", "H10", "H10", "H10", "H10", "H10"] 

我正在尝试将第一个代码替换为从 mask 开始的第二个代码,但出现以下错误。


for i in range(len(dat)):
    index = names.index(dat['col1'][i])
    if index < len(names)-1:
        dat.loc[i, 'col2'] = names[index + 1]
    else:
        break

mask = []

for i in range(len(dat)):
    mask.append(names.index(dat['col1'][i]) < len(names) - 1)


dat['col2'] = np.where(mask, names[names.index(dat['col1'])+1], np.NaN)

我得到的错误是

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

这是因为names[names.index(dat['col1'])+1] 没有对dat['col1'] 中的每一行进行迭代。

所以我想要的是在不使用下面提到的 for 的情况下遍历 pandas 中的行,并将 dat['col1'] 的值分配给 dat['col2'],但进行了转移。预期的结果应该是这样的

dat['col2'] = ["Z9", "Z9", "Z9", "H10", "H10", nan, nan, nan, nan, nan]

【问题讨论】:

【参考方案1】:

您可以在从列表创建字典后使用series.map()

d=a:b for a,b in zip(names,names[1:])
#'U9': 'Z9', 'Z9': 'H10'
dat['col2']=dat.col1.map(d)

0     Z9
1     Z9
2     Z9
3    H10
4    H10
5    NaN
6    NaN
7    NaN
8    NaN
9    NaN

使用get,您还可以获得索引与值:

pd.Series(d).get(dat.col1)

col1
U9      Z9
U9      Z9
U9      Z9
Z9     H10
Z9     H10
H10    NaN
H10    NaN
H10    NaN
H10    NaN
H10    NaN

【讨论】:

以上是关于自动查找列表项的索引,该列表项包含在每一行的特定 pandas 列中的主要内容,如果未能解决你的问题,请参考以下文章

python 按值查找列表项的索引

如何查看特定列表视图项的详细数据

在递减然后递增并且可能包含重复项的列表中查找最小值

根据列表项的索引模数执行不同的操作

Redis数据操作--列表

Redis数据操作之列表 | Redis