使大多数列 None If Condition in Python

Make Most Columns None If Condition in Python

我有一个包含一个布尔列的 pandas 数据框。如果布尔值是 False,我想将大部分列设置为“None”。我不想更改我正在迭代的对象,但是执行此操作的优雅方法是什么?

import numpy as np
df['result'] = np.where(df['boolean col'] == False, np.nan, 'Not Null')

您可以使用 apply 函数迭代行:

import pandas as pd
import random

df = pd.DataFrame(
   {"a": list(range(10)), 
    "b": list(range(10)), 
    "c": [random.choice((True, False)) for _ in range(10)]
})

def mask(row):
   if row["c"]:
      row["a"] = None
   return row

df.apply(mask, axis=1)

产生以下结果:

   a    b      c
0  0  0.0  False
1  1  1.0  False
2  2  NaN   True
3  3  3.0  False
4  4  NaN   True
5  5  NaN   True
6  6  NaN   True
7  7  NaN   True
8  8  NaN   True
9  9  NaN   True

同时原始数据帧没有改变。

这当然不是最快的方法,但是非常灵活。如果速度是一个重要因素,您还可以考虑 where 方法。

cols_to_replace = ["a", "b"]
new_col_names = ["new_" + col for col in cols_to_replace]
df[new_col_names] = df[cols_to_replace].where(df["c"])