首页 > 解决方案 > 根据更改的列条件设置多个列值

问题描述

我想采用不同重要性级别的数据框,从第一到第三,例如:

    FIRST    SECOND    THIRD
0   Yes      Yes       Yes
1   Yes      No        No
2   No       Yes       Yes
3   No       No        Yes

并说如果 FIRST 是最高级别,并且 FIRST = Yes,则将其余列设置为 No。此逻辑应沿链向下延伸,即如果 FIRST = No,但 SECOND = YES,则 THIRD 应 = NO。

本质上,它应该只在价值最高的列中保留“是”。在我的真实数据框中,No 只是一个空字符串“”。

示例输出:

    FIRST    SECOND    THIRD
0   Yes      No        No
1   Yes      No        No     #Stays the same
2   No       Yes       No
3   No       No        Yes    #Stays the same

我已经用嵌套的 for 循环实现了它,但这显然不适用于任何 Pandas。我敢肯定有一个更优雅的矢量化解决方案,任何人都可以帮助我,谢谢!

标签: pythonpandas

解决方案


Comapre by Yesand for 首先Yes使用 double DataFrame.cumsum,然后比较 by1并创建 new DataFramewith numpy.where

mask = df.eq('Yes').cumsum(axis=1).cumsum(axis=1).eq(1)

df = pd.DataFrame(np.where(mask, 'Yes','No'), index=df.index, columns=df.columns)
print (df)
  FIRST SECOND THIRD
0   Yes     No    No
1   Yes     No    No
2    No    Yes    No
3    No     No   Yes

推荐阅读