首页 > 解决方案 > 如何使用循环将多个条件应用于数据帧

问题描述

我有以下数据框

dict1 = {'x_math_lp': {'John':'0',
                  'Lisa': 1,
                  'Karyn': '2'},
         'o_math_lp': {'John': 0.005,
                       'Lisa': 0.001,
                       'Karyn':0.9}}
df= pd.DataFrame(dict1)

我想应用一个条件,如果第一列中的值小于 1,并且第二列中的值 >= 0.05,则将第一列中的值替换为“NaN”

结果应如下所示

       x_math_lp    o_math_lp
John    NaN          0.005
Lisa    1            0.001
Karyn   NaN          0.900

注意:我想使用循环的原因是因为我的真实数据框有 30 列,我要为数据框中设置的每个列对执行此操作,本质上是更新整个数据框。

标签: pythonpandasloopsconditional-statements

解决方案


您可以使用.loc您想要的列并检查您的状况,如下所示。(因为你可以使用 一些数字x_math_lpstrpd.to_numeric

尝试这个:

>>> import numpy as np
>>> df.x_math_lp = pd.to_numeric(df.x_math_lp, errors='coerce')
>>> df.loc[((df['x_math_lp'] < 1) | (df['o_math_lp'] >= 0.005)), 'x_math_lp'] = np.nan
>>> df
       x_math_lp    o_math_lp
John    NaN         0.005
Lisa    1           0.001
Karyn   NaN         0.900

如果要为每个列对在多个列上运行,可以使用:

>>> df= pd.DataFrame({'x_math_lp': {'John': 0,'Lisa': 1,'Karyn': 2},'o_math_lp': {'John': 0.005,'Lisa': 0.001,'Karyn':0.9},'y_math_lp': {'John': 0,'Lisa': 1,'Karyn': 2},'p_math_lp': {'John': 0.005,'Lisa': 0.001,'Karyn':0.9}})
>>> columns = df.columns
>>> for a,b in  zip(columns[::2],columns[1::2]):
...    df.loc[((df[a] < 1) | (df[b] >= 0.005)), a] = np.nan
>>> df

       x_math_lp    o_math_lp   y_math_lp   p_math_lp
John     NaN         0.005            NaN   0.005
Lisa     1.0         0.001            1.0   0.001
Karyn    NaN         0.900            NaN   0.900

推荐阅读