比较来自不同数据帧的值,python

时间:2017-06-09 11:21:56

标签: python dataframe compare valueerror

我有两个不同行数的数据帧。

X&Y are coordinates in 2D position

DF1:

X,Y,C
1,1,12
2,2,22
3,3,33
4,4,45
5,5,43
6,6,56

DF2: X,Y开始下一个X,Y END squere

X,Y,X1,Y1
1,1,3,3
2,2,4,4

part of my code

A = (abs(DF1['X']).values > abs(DF2['X']).values)
B = (abs(DF1['Y']).values > abs(DF2['Y']).values)
C = (abs(DF1['X']).values < abs(DF2['X1']).values)
D = (abs(DF1['Y']).values < abs(DF2['Y1']).values)
RESULT = A & B & C & D
result=DF1[RESULT]

另外:我只能使用DF2的2列,而在RESULT中只能使用A&amp; B,它唯一的例子。现在2次X和Y向我展示了值的范围。

当DF2只有一行时,就可以了。但是我收到了不止一个: ValueError: operands could not be broadcast together with shapes 我知道我需要创建一个规则,将所有线路进行比较,但我不知道如何,我尝试过差异,但没有好结果。

输出: 我需要删除此错误并开始逐行使用。 对于DF2中的每一行,我需要单独的结果: 对于第1行:

X,Y,C
2,2,22

第2行

X,Y,C
3,3,33

每次检查一行后,我需要将数据帧结果保存到一个文件中 所以在这个例子中,在一个文件中会有``

2,2,22
3,3,33

感谢您的建议

编辑: 为Tbaki

def isInSquare(row, df2):
    df2=result_from_other_def1.df1
    df1=result_from_other_def2.df2

    if (row.X > df2.iloc[0].X) and (row.Y > df2.iloc[1].Y):
        if (row.X < df2.iloc[0].X1) and (row.Y < df2.iloc[1].Y2):
            if (row.X < df2.iloc[1].X) and (row.Y < df2.iloc[1].Y):
                if (row.X > df2.iloc[0].X) and (row.Y > df2.iloc[1].Y2):
                    return True
    return False

DF1.apply(lambda x: isInSquare(x,DF2),axis= 1)# if i will leave this line在这里,tk inter会自动运行它,所以我的意思是这应该是内部定义。    另外我不知道DF1和DF2中有多少行。 感谢

1 个答案:

答案 0 :(得分:0)

检查此代码,检查5x5平方。

  var start, end;
  var plotColor = [];
  start = new Date().getTime();
  for (var i = 0; i < data.length; i++) {
    // get raw points
    x = data[i][0];
    y = data[i][1];
    // convert to a point on canvas
    pointX = getPointOnCanvas(x);
    pointY = getPointOnCanvas(y, 'y');
    color = getColorOfCell({
      gateChain: allGatesChain,
      events: events,
      i: i
    });
    color = color;
    plotColor.push({
        color: color,
        pointX: pointX,
        pointY : pointY
    });
  }
  end = new Date().getTime();
  var _str = "loop execution took: "+(end-start)+" milliseconds.";
  console.log(_str);
  res.send(_str);

输出

DF1 = pd.DataFrame({"X":[1,2,3,4,5,6],"Y":[1,2,3,4,5,6],"C":[12,22,33,45,13,56]})
DF2 = pd.DataFrame({"X":[1,5],"Y":[1,1],"X1":[5,1],"Y1":[5,5]})

def isInSquare(row, df2):
    c1 =  (row.X > df2.iloc[0].X) and (row.Y > df2.iloc[0].Y)
    c1 = c1 and  (row.X < df2.iloc[0].X1) and (row.Y < df2.iloc[0].Y1)
    c1 = c1 and (row.X < df2.iloc[1].X) and (row.Y > df2.iloc[1].Y)               
    c1 = c1 and (row.X > df2.iloc[1].X1) and (row.Y < df2.iloc[1].Y1)
    return c1    

DF_NEW = DF1[DF1.apply(lambda x: isInSquare(x,DF2),axis= 1)]

如果你想保持最大C:

    C   X   Y
1   22  2   2
2   33  3   3
3   45  4   4