按行遍历,对每一行进行处理:
for index, row in df_dir.iterrows():
提取每一行的数:
x_1 = row['A1'] y_1 = row['B1']
对这一行某一列的值进行修改:
df_dir.loc[index,'类型'] = 5
已知某一列的某个数,反推该数的indexs:
indexs = df_temp[(df_temp['dir_factor'] == ref)].index.tolist()
import pandas as pd
import numpy as np
import math
path = r'D:\Ubuntu_disk\false_detection\Record033'
df_dir = pd.read_csv( path + '\\result_plane.csv',error_bad_lines=False,encoding='gbk')
df_dir = df_dir.drop(0,axis=0,inplace=False)
# 对平面向量A1 B1进行归一化处理
def calc_norm1(data1):
return math.sqrt(data1.A1**2 + data1.B1**2 + data1.C1**2)
df_dir['norm1'] = df_dir.apply(calc_norm1, axis = 1)
df_dir['A1'] /= df_dir['norm1']
df_dir['B1'] /= df_dir['norm1']
# 计算方向系数
def calc_f(data1):
return abs(data1.B1/data1.A1)
df_dir['dir_factor'] = df_dir.apply(calc_f, axis=1)
df_dir['angle'] = df_dir.apply(calc_f, axis=1)
# 获取总共的分段数box
len_total = df_dir.shape[0]
box_num = int(df_dir.iloc[len_total-1, 3])
#定义一个存放每个box的方向系数参考值的list
dir_factor_list = []
# 对每段box内计算得到一组方向系数的参考值
for box_id in range(0, box_num+1):
df_temp = df_dir[(df_dir['分段ID'] == box_id) & (df_dir['类型'] == 2)]
dir_factor = np.array(df_temp['dir_factor'])
dir_factor.sort()
len1 = len(dir_factor)
# 有可能有的box内没有2类型的面,那么存入0
if(len1):
# 方向系数参考值 ref,然后根据ref从df里搜索到同一列的A1和B1
ref = dir_factor[len1//2]
indexs = df_temp[(df_temp['dir_factor'] == ref)].index.tolist()
x = df_temp.loc[indexs[0], 'A1']
y = df_temp.loc[indexs[0], 'B1']
dir_factor_list.append({float(x),float(y)})
else:
dir_factor_list.append(0)
# 遍历每一列计算angle值,如果angle值在(60-120°),那么判定为纵向面,类型改为5
for index, row in df_dir.iterrows():
if(row['类型'] == 2):
x_1 = row['A1']
y_1 = row['B1']
norm_1 = math.sqrt(x_1**2 + y_1**2)
if(dir_factor_list[int(row['分段ID'])]):
x_0 , y_0= dir_factor_list[int(row['分段ID'])]
norm_2 = math.sqrt(x_0**2 + y_0**2)
c = (x_1*x_0 + y_1*y_0)/(norm_1 * norm_2)
c = min(1, c)
c = max(-1,c)
angle_ = math.degrees(math.acos(c))
df_dir.loc[index,'angle'] = angle_
if(abs(angle_ - 90) < 30):
df_dir.loc[index,'类型'] = 5
else:
df_dir.loc[index,'angle'] = 0
df_dir = df_dir.drop(['norm1','dir_factor'], axis=1)
df_dir.to_csv(path + '\\result_plane_select_plane5.csv', sep=',',index=False,encoding='gbk')