使大多数列 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"])
我有一个包含一个布尔列的 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"])