Python Pandas根据多个其他列中的条件替换一列中的值[重复]

Posted

技术标签:

【中文标题】Python Pandas根据多个其他列中的条件替换一列中的值[重复]【英文标题】:Python Pandas replace values in one column based on conditional in multiple other columns [duplicate] 【发布时间】:2018-09-15 13:20:13 【问题描述】:

使用数据框 df:

Product_ID | Category_A   | Category _B
1232             0              0 
1343             Unknown        X
2543             Nan            0 
2549             Y              Y
0349             X              X
8533             Y              X

我想创建一个新列 Category_Final,其规则如下:

如果 Category_A 为 0、Unknown 或 Nan,Category_Final 应为“Unknown” 如果 Category_A 与 Category_B 相同,Category_Final 应为 0 如果 Category_A 与 Category_B 不同,Category_Final 应该是 X

预期输出:

Product_ID | Category_A   | Category _B | Category_Final
1232             0              0            Unknown
1343             Unknown        X            Unknown
2543             Nan            0            Unknown
2549             Y              Y            0
0349             X              X            0
8533             Y              X            X

我设法获得了 0 和 X 的逻辑,但我不知道如何包含未知逻辑。

df['Category_Final'] = np.where(df['Category_A'] != df['Category_B'], 'X', '0')

谢谢!

【问题讨论】:

我认为在这些情况下,numpy select 提供了最易读的解决方案:Pandas conditional creation of a series/dataframe column 【参考方案1】:

在当前行之后,试试这个:

mask = ((df.Category_A.isnull()) | 
        (df.Category_A == 'Unknown') | 
        (df.Category_A == 0))
df.loc[mask, 'Category_Final'] = 'Unknown'

【讨论】:

【参考方案2】:

你可以使用嵌套的np.where

df['Category_Final'] = np.where((df['Category_A'].isnull() | \
                                              (df['Category_A'] == 'Unknown') | (df['Category_A'] == '0')),\
                                              'Unknown', np.where(df['Category_A'] == \
                                                                  df['Category_B'], 0, 'X'))

输出

Product_ID  Category_A  Category_B  Category_Final
0   1232    0            0            Unknown
1   1343    Unknown      X            Unknown
2   2543    NaN          0            Unknown
3   2549    Y            Y              0
4   349     X            X              0
5   8533    Y            X              X

【讨论】:

完美!我知道我很接近了,谢谢!【参考方案3】:
df['Category_Final'] = (
    df.apply(lambda _: "0", axis=1)
    .where(df['Category_A'] == df['Category_B'], "X")
    .where(~df['Category_A'].isin(["0", "Unknown", np.NaN]), "Unknown")
)

【讨论】:

仅供参考的代码答案不被接受

以上是关于Python Pandas根据多个其他列中的条件替换一列中的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据其他列中的值在 python 3 (pandas) 数据框中创建新列

根据两列中的文本拆分行(Python,Pandas)

如何根据python中的多个条件计算列中的唯一行

Pandas DataFrame:根据条件替换列中的所有值

使用 python pandas 在多个列中进行选择?

Pandas Python 中的条件乘法