连接不满足条件的列

2024-04-19 19:01:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下资料:

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

如何返回所需的输出


Tags: dfifnanpddf1valuesdf2test1
1条回答
网友
1楼 · 发布于 2024-04-19 19:01:51

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

df = df_filtrado.combine_first(df1)

如果可能,一些NaN

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

相关问题 更多 >