【问题标题】:Updating pandas index and row in nested while loop在嵌套的while循环中更新熊猫索引和行
【发布时间】:2021-11-27 22:36:26
【问题描述】:

我面临着在使用pd.iterrows() 生成器的for 循环中迭代更新rowindex 的挑战。在下面的示例中,我的目标是从索引 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


    【解决方案1】:

    您可以在此处利用 less than 和 cumsum 来标记超过阈值的连续值和不超过阈值的先前值。基于此,您只需要大于 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2021-11-10
      • 2021-11-28
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      相关资源
      最近更新 更多