我有一个如下所示的数据框:
我需要选择那些三个角度中的任何一个都不接近90或180的行为35的行。例如,我需要选择具有角度值的行,如:50,50,140。 / p>
请帮忙。提前谢谢。
def check_angle(df_list):
ANGLE_THRESHOLD = 35
ANGLE_NINETY = 90
ANGLE_ONE_EIGHTY = 180
for df in df_list:
print df.loc[df['Angle'].str.split(',')[0] >= (ANGLE_NINETY + ANGLE_THRESHOLD)]
直到现在,我已经尝试了这个,但它抛出了KeyError。
答案 0 :(得分:0)
如果df
是您的数据框
A B
0 1 92.36,89.1,177.47
1 2 90.49,90.9,178.97
2 3 91.66,92.4,177.08
3 4 94,86.87,174.92
4 5 97.41,85.65,173.8
5 5 20.41,20.65,20.8
您可以使用拆分(',')拆分它并遍历行。
df_tmp = pd.DataFrame([[val.split(",")[0],val.split(",")[1],val.split(",")[2] ] for val in df.B])
返回的布尔值可用于创建新的数据帧
df_tmp2 = pd.DataFrame({
"val1in":(df_tmp[0].astype(float)>(90.-35.)) & (df_tmp[0].astype(float)<(90.+35.)) | (df_tmp[0].astype(float)>(180.-35.)) & (df_tmp[0].astype(float)<(180.+35.)),
"val2in":(df_tmp[1].astype(float)>(90.-35.)) & (df_tmp[1].astype(float)<(90.+35.)) | (df_tmp[1].astype(float)>(180.-35.)) & (df_tmp[1].astype(float)<(180.+35.)),
"val3in":(df_tmp[2].astype(float)>(90.-35.)) & (df_tmp[2].astype(float)<(90.+35.)) | (df_tmp[2].astype(float)>(180.-35.)) & (df_tmp[2].astype(float)<(180.+35.))
})
根据您可以选择行
print (df[np.all(df_tmp2,axis =1)==False])
答案 1 :(得分:0)
你可以这样做:
df=pd.DataFrame({"A":[1,2,3,4],"val":[[140,89.1,177.47],[90.49,90.9,178.90],[91.66,92.4,177.08],[135,85.65,173.8]]})
B=[]
C=[]
D=[]
for i in range(len(df)):
B.append(df["val"][i][0])
C.append(df["val"][i][1])
D.append(df["val"][i][2])
df["B"]=B
df["C"]=C
df["D"]=D
print(df.query("(B < 180-35 & B > 90+35) | (C < 180-35 & C > 90+35) | (D < 180-35 & D > 90+35)"))
A val B C D
0 1 [140, 89.1, 177.47] 140.0 89.10 177.47
3 4 [135, 85.65, 173.8] 135.0 85.65 173.80
为方便起见,您也可以在选择后删除colmns B,C,D
答案 2 :(得分:0)
您可以将str.split
与expand=True
一起用于DataFrame并转换为float
s,然后与条件进行比较,并使用~
的反向掩码使用boolean indexing
和all
用于检查所有False
行:
df=pd.DataFrame({"S/N":[1,2,3,4],
"Angle":['50,50,140','90.49,90.9,178.90',
'91.66,92.4,177.08','135,85.65,173.8']})
print (df)
Angle S/N
0 50,50,140 1
1 90.49,90.9,178.90 2
2 91.66,92.4,177.08 3
3 135,85.65,173.8 4
AT = 35
AN = 90
AO = 180
a = df['Angle'].str.split(',', expand=True).astype(float)
m = ((a > AN-AT) & (a < AN+AT)) | ((a > AO-AT) & (a < AO+AT))
print (m)
0 1 2
0 False False False
1 True True True
2 True True True
3 False True True
df = df[(~m).all(axis=1)]
print (df)
Angle S/N
0 50,50,140 1