【发布时间】:2021-11-27 22:36:26
【问题描述】:
我面临着在使用pd.iterrows() 生成器的for 循环中迭代更新row 和index 的挑战。在下面的示例中,我的目标是从索引 0 开始获取每个连续字母与 first 字母 (A) 之间的距离:
import pandas as pd
import string
data = {'letter':['A', 'C', 'D', 'X', 'X', 'Z', 'A', 'E', 'Z', 'Y', 'D', 'B', 'A']}
start_idx=df['letter'].iloc[0]
for index, row in df.iloc[1:].iterrows():
dist= abs(string.ascii_uppercase.index(df['letter'].iloc[0]) - \
string.ascii_uppercase.index(df['letter'].iloc[index]))
print(dist)
2
3
23
23
25
0
4
25
24
3
1
0
这很容易。但是,如果距离超过 5,那么我想开始使用 while 循环将以下字母与与前一个距离
import pandas as pd
import string
data = {'letter':['A', 'C', 'D', 'X', 'X', 'Z', 'A', 'E', 'Z', 'Y', 'D', 'B', 'A']}
bad_letters = []
start_idx=df['letter'].iloc[0]
compare_letter = string.ascii_uppercase.index(df['letter'].iloc[0])
for index, row in df.iloc[1:].iterrows():
dist= abs(compare_letter-string.ascii_uppercase.index(row['letter']))
if dist > 5:
compare_letter = string.ascii_uppercase.index(df['letter'][index-1]) #reset compare letter
abnormal=True
while abnormal:
bad_letters.append(index)
dist=abs(compare_letter-string.ascii_uppercase.index(df['letter'][index]))
index+=1 #increment index
if dist <=5:
abnormal=False
compare_letter=string.ascii_uppercase.index(df['letter'][index])
#?update iterrows index with this index#
break
else:
continue
输出列表bad_letters应该是:[3,4,5,8,9] 对应于:
-在索引 2 处与 D 偏差超过 5 的字母 X,X,Z 的索引
- 字母 Z,Y 的索引,在索引 7 处与字母 E 的偏差超过 5。
上述尝试失败了,我不确定如何以有效地使用 iterrows() 和 while 循环的方式正确地构造它。如何使用iterrows() 内部的while 循环或不同的pandas 数据帧生成器来回答这个基本问题?如何使用破坏嵌套 while 循环的索引迭代地“更新”原始 for 循环的 index 和 row?任何建议将不胜感激。
【问题讨论】:
标签: python pandas for-loop while-loop generator