在使用row
生成器的for循环中,我面临迭代更新pd.iterrows()
和index
的挑战。在下面的示例中,我的目标是从索引0获得每个连续字母与第一个字母(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,那么我想开始比较以下字母与最后一个“正常”字母的距离,后者的距离是<= 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,对应于:
字母的-the指数X,X,Z,它在指数2处偏离D>5
-the字母指数Z,Y,在指数7处偏离字母E>5。
上面的尝试失败了,我不知道如何正确地构造这个结构,以便有效地使用带with循环的iterrows()
。如何使用iterrows()
内部的while循环或不同的熊猫数据生成器来回答这个基本问题?如何迭代地“更新”原始for循环的索引和行?如有任何建议,将不胜感激。
发布于 2021-10-07 13:31:01
您可以在这里使用小于和累计值来标记超过阈值和未超过阈值的连续值。基于此,您只需要组> 2,您可以将这些组值与组中的第一个值进行比较,并输出那些仍然太远的值。
import pandas as pd
data = pd.DataFrame({'letter':['A', 'C', 'D', 'X', 'X', 'Z', 'A', 'E', 'Z', 'Y', 'D', 'B', 'A']})
data['dist'] = data.letter.apply(ord)-ord('A')
data['group'] = data.dist.lt(5).cumsum()
data = data.groupby('group').filter(lambda x: len(x)>1)
data = data.groupby('group').apply(lambda x: (x['dist']-x['dist'].iloc[0])>5).reset_index()
data.loc[data['dist']==True]['level_1'].values
输出
array([3, 4, 5, 8, 9], dtype=int64)
https://stackoverflow.com/questions/69487878
复制