【问题标题】:How to apply multiple conditions to dataframe with loop如何使用循环将多个条件应用于数据帧
【发布时间】:2021-11-23 18:56:20
【问题描述】:

我有以下数据框

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 列,我要为数据帧中设置的每个列对执行此操作,本质上是更新整个数据帧。

【问题讨论】:

    标签: python pandas loops conditional-statements


    【解决方案1】:

    您可以将.loc 用于您想要的列并检查您的状况,如下所示。 (因为x_math_lp 中的某个数字是str 你可以使用pd.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
    

    【讨论】:

    • 感谢您的回复。结果是正确的,但如果 df['o_math_lp'] 小于零,则不适用条件。这两个条件都需要满足,然后我们更新第一列。
    • 第一个条件是否缺失? df.loc[(df['x_math_lp'] &lt; 1) | (df['o_math_lp'] &gt;= 0.005), 'x_math_lp'] = np.nan。 (他用“和”解释了他的问题,但我根据预期输出输入了or 运算符。)
    • @OnurOdabaşı 谢谢你的评论
    • 非常感谢你们,我将尝试使用它来生成一个循环来处理我的整个数据集。
    猜你喜欢
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2020-06-09
    • 2021-12-11
    • 1970-01-01
    • 2022-01-08
    • 2017-07-21
    相关资源
    最近更新 更多