Pandas使用链式规则在现有列的基础上创建一个新列



我有下面的代码

import pandas as pd
import numpy as np
df = pd.DataFrame({"A":[12, 4, 5, 3, 1],"B":[7, 2, 54, 3, None],"C":[20, 16, 11, 3, 8],"D":[14, 3, None, 2, 6]})
df['A1'] = np.where(df['A'] > 10, 10, np.where(df['A'] < 3, 3, df['A']))

虽然这是可以的,但我希望使用第一行的链式规则创建最终的dataframe(即第二行代码(。我想做到这一点以提高可读性。

你能帮我怎么做到这一点吗?

您可以在此处使用剪辑:

df.assign(A1=df['A'].clip(upper=10,lower=3))

A     B   C     D  A1
0  12   7.0  20  14.0  10
1   4   2.0  16   3.0   4
2   5  54.0  11   NaN   5
3   3   3.0   3   2.0   3
4   1   NaN   8   6.0   3

如果你真的需要在一行中完成(注意,我觉得这不可读(

pd.DataFrame({"A":[12, 4, 5, 3, 1],
"B":[7, 2, 54, 3, None],
"C":[20, 16, 11, 3, 8],
"D":[14, 3, None, 2, 6]}).assign(A1=lambda x:x['A'].clip(upper=10,lower=3))

您可以像下面这样使用np.select((。它使条件和选择非常易读。

conditions = [df['A'] > 10,
df['A'] < 3]
choices = [10,3]
df['A2'] = np.select(conditions, choices, default = df['A'])
print(df)
A     B   C     D  A1
0  12   7.0  20  14.0  10
1   4   2.0  16   3.0   4
2   5  54.0  11   NaN   5
3   3   3.0   3   2.0   3
4   1   NaN   8   6.0   3

相关内容

最新更新