如何从Python中的两个不同数据框中的两个不同索引中提取信息?

时间:2016-05-30 17:19:06

标签: python python-2.7 pandas dataframe

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

      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的值,但只有索引一样长0中的Df20中的索引Df1匹配。然后我想保存计算的内容并进行循环。

我尝试了各种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循环开始会导致堆栈溢出,并且没有任何反应。如果我一个接一个地打印并打印就可以了。任何人都可以帮助一个绝望的初学者吗?

1 个答案:

答案 0 :(得分:0)

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

无论如何,请尝试查看以下配方是否符合您的要求。它依赖于嵌套循环和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;如果是这样的话,可能想把它放在标签中)。数组都是字符串,这就是我永远不会将任何内容转换为数字的原因。平等将起到同样的作用。