首页 > 解决方案 > 在 DataFrame 的列中迭代和应用条件语句时无法获得正确的结果

问题描述

我有一个数据框框架,我需要在其中迭代其中一列并应用某些条件语句来使用一个或另一组方程。

我已经写了下面的代码。但是,我没有得到正确的结果。在代码中,会检查 input_data 变量的正值,但在遇到负值时不满足条件,并且始终将方程应用于正值的情况。

提前感谢您对此的任何建议

import pandas as pd
x=[-1,1]
y=[2,3]

df=pd.DataFrame({'x':x, 'y':y})
print(df)

   x  y
0 -1  2
1  1  3

input_data=df['x']

for i in range(len(input_data)):
    
if input_data[i]>0:
    df['z']=input_data[i]+1
    df['z2']=df['z']+1
    df['z3']=1
else:
    df['z']=input_data[i]-1
    df['z2']=df['z']-1
    df['z3']=0
        
print(df)
   x  y  z  z2  z3
0 -1  2  2   3   1
1  1  3  2   3   1

标签: pandasif-statement

解决方案


在 pandas 中,循环通常通过以下方式实现apply()

df[['z','z2','z3']] = df.apply(
    lambda row: [row.x+1, row.x+2, 1] if row.x > 0 else [row.x-1, row.x-2, 0],
    result_type='expand',
    axis=1)

#    x  y    z   z2   z3
# 0 -1  2 -2.0 -3.0  0.0
# 1  1  3  2.0  3.0  1.0

或者您可以使用矢量化np.where()

df['z'] = np.where(df.x > 0, df.x + 1, df.x - 1)
df['z2'] = np.where(df.x > 0, df.z + 1, df.z - 1)
df['z3'] = df.x.gt(0).astype(int)

#    x  y  z  z2  z3
# 0 -1  2 -2  -3   0
# 1  1  3  2   3   1

至于for循环实现,问题是由于赋值语句造成的。

例如df['z3'] = 1将整z3列设置为1(不仅仅是任何特定的行,z3而是整列)。同样df['z3'] = 0将整列设置为 0。这适用于所有这些赋值语句。

那么因为最后一个x值是正的,所以最后的迭代将所有z列设置为正结果。


推荐阅读