【发布时间】: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