从基于列的pandas数据框中选择数据,列由列表中的值组成?

时间:2018-02-06 08:07:51

标签: python pandas dataframe

我有一个如下所示的数据框:

enter image description here

我需要选择那些三个角度中的任何一个都不接近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。

3 个答案:

答案 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.splitexpand=True一起用于DataFrame并转换为float s,然后与条件进行比较,并使用~的反向掩码使用boolean indexingall用于检查所有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