python - 自动查找每行的特定 pandas 列中包含的列表项的索引

标签 python pandas list indexing

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

假设我有一个包含 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: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

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

所以我想要的是迭代 pandas 中的行,而不使用下面提到的 for 并将 dat['col1'] 的值分配给 dat['col2'] 但发生了变化。预期的结果应该是这样的

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

最佳答案

您可以使用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

关于python - 自动查找每行的特定 pandas 列中包含的列表项的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56514511/

相关文章:

list - F# 中反转列表的列表

python - 如何在 pytorch 中使用多个 GPU 训练模型?

python - PyOpenGL 将 View 坐标转换为用于 ArcBall 导航的对象坐标

javascript - 上传多个文件并显示进度条

python - 如何有效地仅绘制那些落在 map 边界框中的点?

java - java如何组合列表对象?

python - 将列表列表转换为数据框

python - 如何使用列作为索引获取 pandas 数据框中某个位置的单元格

python - 使用条件打印数据框中的特定行

python - 访问特定列表项时出现问题