【问题标题】:Join columns that do not satisfy the condition连接不满足条件的列
【发布时间】:2017-06-06 08:48:07
【问题描述】:

我有以下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

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

【问题讨论】:

    标签: python loops pandas dataframe


    【解决方案1】:

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

    df = df_filtrado.combine_first(df1)
    

    如果可能的话,一些NaNs:

    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
    

    【讨论】:

      猜你喜欢
      • 2022-07-19
      • 2019-03-14
      • 2019-04-29
      • 2019-02-26
      • 2022-01-22
      • 2016-08-10
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多