我试图自动查找,而不使用每行特定 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/