加入不满足条件的列

时间:2017-06-06 08:48:07

标签: python loops pandas dataframe

我有以下df:

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

然后我将每行划分为前一个获得:

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

我希望每个高于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的值的列,如df2的C列。

这是我尝试过的(将其添加到上一个代码中):

    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

如何返回所需的输出??

1 个答案:

答案 0 :(得分:2)

我认为最简单的是使用combine_first,如果没有NaN值:

df = df_filtrado.combine_first(df1)

如果可能的话{@ 1}}:

NaN