如何在Pandas中通过多条件判断生成新列Col C?
问题描述
现有如下Pandas DataFrame:
| Col A | Col B ----------------------- | NaN | 3144 | NaN | 3145 | 123 | 3246 | NaN | NaN
需新增一列Col C,遵循以下逻辑:
- 当
Col A为null且Col B非null时,Col C取值为"A" - 当
Col A和Col B均非null,或两者均为null时,Col C取值为"B"
期望输出结果:
| Col A | Col B | Col C ------------------------------------- | NaN | 3144 | A | NaN | 3145 | A | 123 | 3246 | B | NaN | NaN | B
解决方案
方法1:使用numpy.where(直观易懂,适合新手)
这是最直接的实现方式,通过布尔条件判断分支:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'Col A': [np.nan, np.nan, 123, np.nan], 'Col B': [3144, 3145, 3246, np.nan] }) # 定义触发"A"的条件:Col A为空 且 Col B不为空 condition = df['Col A'].isna() & ~df['Col B'].isna() # 按条件赋值:满足条件设为"A",其余设为"B" df['Col C'] = np.where(condition, 'A', 'B')
方法2:布尔索引直接赋值(无需额外导入numpy)
先给所有行默认赋值"B",再修改满足条件的行,逻辑清晰:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Col A': [np.nan, np.nan, 123, np.nan], 'Col B': [3144, 3145, 3246, np.nan] }) # 先给Col C统一赋值"B" df['Col C'] = 'B' # 筛选出符合条件的行,将Col C改为"A" df.loc[df['Col A'].isna() & ~df['Col B'].isna(), 'Col C'] = 'A'
方法3:使用apply(适合更复杂的自定义逻辑)
如果后续逻辑需要扩展,可使用apply逐行处理,但大数据量下效率略低于前两种方法:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Col A': [np.nan, np.nan, 123, np.nan], 'Col B': [3144, 3145, 3246, np.nan] }) def get_col_c(row): # 判断符合"A"的条件 if pd.isna(row['Col A']) and not pd.isna(row['Col B']): return 'A' # 其余情况返回"B" else: return 'B' # 逐行应用函数生成Col C df['Col C'] = df.apply(get_col_c, axis=1)
内容的提问来源于stack exchange,提问作者aditya tandel
相关产品推荐
相关产品推荐

