逐行比较来自不同数据帧的值,python
comparing values from different dataframes line by line, python
我有两个行数不同的数据框。
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
结束广场
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 列,并且在结果中将仅使用 A 和 B,这是唯一的示例。现在 X 和 Y 的 2 倍显示了值的范围。
当DF2只有一根线时,可以。但是我收到了不止一个:
ValueError: operands could not be broadcast together with shapes
我知道我需要创建一个规则来比较所有行,但我不知道如何,我尝试过 diff,但没有好的结果。
输出:
我需要删除这个错误并开始逐行使用。
对于 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 中会有多少行。
谢谢
检查此代码,检查 5x5 正方形。
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 X Y
1 22 2 2
2 33 3 3
3 45 4 4
如果你想保持最大 C:
DF_NEW = DF_NEW.groupby(["X","Y"]).max().reset_index()
我有两个行数不同的数据框。
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
结束广场
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 列,并且在结果中将仅使用 A 和 B,这是唯一的示例。现在 X 和 Y 的 2 倍显示了值的范围。
当DF2只有一根线时,可以。但是我收到了不止一个:
ValueError: operands could not be broadcast together with shapes
我知道我需要创建一个规则来比较所有行,但我不知道如何,我尝试过 diff,但没有好的结果。
输出: 我需要删除这个错误并开始逐行使用。 对于 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 中会有多少行。
谢谢
检查此代码,检查 5x5 正方形。
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 X Y
1 22 2 2
2 33 3 3
3 45 4 4
如果你想保持最大 C:
DF_NEW = DF_NEW.groupby(["X","Y"]).max().reset_index()