2017-06-06 172 views
1

我有以下DF列:加入不满足条件

df2: 
             A         B         C 
test1      NaN       NaN       NaN 
test2  0.962264  1.025000  1.033333 
test3  1.049020  0.219512  0.983871 
test4  3.738318  1.222222  0.991803 

我期待,对于每个值更高:

df1: 
      A B  C 
test1  1.06 4.0 6.00 
test2  1.02 4.1 6.20 
test3  1.07 0.9 6.10 
test4  4.00 1.1 6.05 

然后我通过以前获得这一鸿沟的每一行比1.35(在df2)或小于0.65乘以df1的先前行高于1.35或小于0.65。

所需的输出会是这个样子:

   A   B   C 
test1  3.96  0.87  6.00 
test2  3.81  0.90  6.20 
test3  4.00  0.90  6.10 
test4  4.00  1.10  6.05 

我所做的代码是这样的:

df_filtrado=pd.DataFrame() 
for i in range(len(df2)): 
    for j in range(len(list(df2.columns))): 
     if df2.iloc[i,j]>1.35: 
      values_higher=pd.concat([df1.iloc[0:i+1,[j]]*df2.iloc[i,j],df1.iloc[i+1:,[j]]]) 
      if df_filtrado.empty: 
       df_filtrado= values_higher 
      else: 
       df_filtrado=pd.concat([df_filtrado,values_higher],axis=1, join_axes=[df_filtrado.index]) 
     elif df2.iloc[i,j]<0.65: 
      values_lower=pd.concat([df1.iloc[0:i+1,[j]]*df2.iloc[i,j],df1.iloc[i+1:,[j]]]) 
      if df_filtrado.empty: 
       df_filtrado= values_lower 
      else: 
       df_filtrado=pd.concat([df_filtrado,values_lower],axis=1, join_axes=[df_filtrado.index]) 

print df_filtrado 

电流输出高达这里确实很好,而且返回以下内容:

  B   A 
test1 0.878049 3.962617 
test2 0.900000 3.813084 
test3 0.900000 4.000000 
test4 1.100000 4.000000 

我不能做的是添加没有任何值的列嗨高于1.35或低于0.65,如C栏df2

这是我曾尝试(将它添加到以前的代码):

normal=pd.DataFrame(df.iloc[:,i]) 
    if df2.iloc[:,i].all()>0.65 and df2.iloc[:,i].all()<1.35: 

     if df_filtrado.empty: 
      df_filtrado= normal 
     else: 
      df_filtrado=pd.concat([df_filtrado,normal],axis=1, join_axes=[df_filtrado.index]) 


print df_filtrado 

但是返回的输出是:

  A   B B   A  C 
test1 1.06 0.878049 4.0 3.962617 6.00 
test2 1.02 0.900000 4.1 3.813084 6.20 
test3 1.07 0.900000 0.9 4.000000 6.10 
test4 4.00 1.100000 1.1 4.000000 6.05 

我怎样才能返回所需的输出?

回答

2

我觉得simpliest是使用combine_first如果没有NaN值:

df = df_filtrado.combine_first(df1) 

如果可能的话有些NaN S:

mask = ((df2 < 0.65) | (df2 > 1.35)).any() 
df = df1.loc[:, ~mask] 
print (df) 
      C 
test1 6.00 
test2 6.20 
test3 6.10 
test4 6.05 

df = pd.concat([df_filtrado, df], axis=1) 
print (df) 
       B   A  C 
test1 0.878049 3.962617 6.00 
test2 0.900000 3.813084 6.20 
test3 0.197561 4.000000 6.10 
test4 1.100000 14.953271 6.05