【问题标题】:How do I do extract information from two different indices in two different data frames in Python?如何从 Python 中两个不同数据帧中的两个不同索引中提取信息?
【发布时间】:2016-05-30 17:19:05
【问题描述】:

我有两个不同长度的数据框:

      Df1                     Df2    
      11    A12               11    B72
      11    E17               12    F15
      11    B72               13    C12
      11    E15  
      11    C12
      11    B2
      43    C11 


我正在尝试执行for 循环来计算Df1 中的所有行,直到索引1 的值出现在Df2 中,但只要Df2 中的索引0 匹配在Df1 中索引0。然后我想保存计算的内容并循环。

我尝试了各种 for-while-if 循环,但都没有真正起作用,这就是我被卡住的地方(对不起,可怕的格式):

     for row_i in range(len(Df2)):
         one_Df2=(Df2.iloc[row_i,1,])
         two_Df2=((int(df.iloc[row_i,0,])))
         for row_ii in range(len(df1)):  
             one_Df1=(df.iloc[row_ii,1,])
             two_Df1=((int(df.iloc[row_ii,0,])))
                  if two_Df1==two_Df2: 
                      if aoi_row_iiii is not aoi_row_iii:
                          counter_2=counter_2+1#--> count +1        
                      else:
                          Df3.append(counter_2)
                          counter_2=0

但是,这个嵌套的 for 循环在开始时会导致堆栈溢出,并且没有任何反应。如果我一个一个地做它们并打印它就可以了。谁能帮助一个绝望的初学者?

【问题讨论】:

    标签: python python-2.7 pandas dataframe


    【解决方案1】:

    我会猜测一下,因为您没有为您的示例提供输出(也尝试在源代码中提供数据,以便其他人可以轻松地将其应用于测试目的)。

    无论如何,试着看看下面的食谱是否能如你所愿。它依赖于嵌套循环和if 语句,这似乎是您的标准:

    df1 = np.array([['11', 'A12'],
                    ['11', 'E17']
                    , ['11', 'B72']
                    , ['11', 'E15']
                    , ['11', 'C12']
                    , ['11', 'B2']
                    , ['12', 'F15']
                    , ['12', 'C12']
                    , ['12', 'B2']
                    , ['13', 'C13']
                    , ['13', 'B2']
                    , ['13', 'F15']
                    , ['13', 'C12']
                    , ['43', 'C11']])
    
    df2 = np.array([['11', 'B72'],
                    ['12', 'F15']
                    , ['13', 'C12']])
    
    counter = []
    for i in range(df2.shape[0]):
        counter.append(0)
        for j in range(df1.shape[0]):
            if df1[j, 0] == df2[i, 0]:
                if df1[j, 1] != df2[i, 1]:
                    counter[-1] += 1
                elif df1[j, 1] == df2[i, 1]:
                    counter[-1] += 1
                    break
    
    print(counter)
    

    ,结果是这样的:

    [3, 1, 4]
    

    我在您的df1 中添加了几个点,以测试检查是否按照我从您的 OP 中解释的方式遵循了每个标准。另请注意,一旦达到停止条件之一,使用 break 停止循环。

    我使用了 numpy 数组,因为它看起来与您在代码中所做的足够相似(尽管我怀疑您使用的是 pandas;如果是这种情况,可能希望将其放在标签中)。数组都是字符串,这就是为什么我从不将任何东西转换为数字。等式也一样。

    【讨论】:

    • 感谢您的回答和耐心等待。并感谢您的问题写作技巧!使用“break”而不是“range(len(df))”有优势吗?
    • @Aggis break 停止内部循环,因此停止计数器向前移动。一旦出现中断,外部循环将处理 df2 的下一个索引。在这种情况下,中断对于算法的工作至关重要。在其他情况下,您可能希望在要停止循环时使用它(例如,您已经完成了列表中所需的所有操作,无需循环到最后,从而节省资源并提高速度)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2023-04-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多