如何使用循环将多个条件应用于数据帧

Posted

技术标签:

【中文标题】如何使用循环将多个条件应用于数据帧【英文标题】: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 列,我要为数据帧中设置的每个列对执行此操作,本质上是更新整个数据帧。

【问题讨论】:

【参考方案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şı 谢谢你的评论 非常感谢你们,我将尝试使用它来生成一个循环来处理我的整个数据集。

以上是关于如何使用循环将多个条件应用于数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个功能应用于dask数据帧的多个块?

如何使用 R 中的条件语句将数据帧拆分为多个数据帧

如何将具有不同参数的多个sklearn算法应用于多个数据帧?

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

Pandas:将 Lambda 应用于多个数据帧

如何使用 for 循环组合多个数据帧?