pandas:如果其他列的任何子组中的值=yes,则将列的值设置为true

2024-09-28 17:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据我的200多列数据库中14列中的值设置一个新列的值

如果全部为空,则设置为“无效”, 如果任何值为“是”,则设置为“真”,否则设置为“假”

下面是3列子集的示例:

   A        B         C
1       
2           Yes       Yes
3  No       Yes       Yes
4  No       Yes       Yes
5  No       No        N/A

期望输出:

   A        B         C     D
1                           Invalid 
2           Yes       Yes   True
3  No       Yes       Yes   True
4  Yes                      True
5  No       No        N/A   False

为此,我修改了以下Setting value of a column based on values of other columns in Pandas dataframe

m1 = dfMSR['A'] == 'Yes'
m2 = dfMSR['B'] == 'Yes'
m3 = dfMSR['C'] == 'Yes'
dfMSR['D'] = np.select([m1 | m2 | m3], [True], default = False)
dfMSR['D'] = np.where(((dfMSR['A'].isnull()) &
                       (dfMSR['B'].isnull()) &
                       (dfMSR['C'].isnull())), 
                      'Invalid', dfMSR['D'])

这是可行的,但我不喜欢编写扩展到14列的代码。有更好的方法吗

谢谢


Tags: ofno数据库falsetrue示例np子集
3条回答

我认为,apply()方法可以帮助您(尽管在这种特定情况下有更直接的方法,但我认为这个通用方法可能会有所帮助。)

首先,以一个小数据帧为例:

    import pandas as pd

    df = pd.DataFrame([[True, True, False], 
                       [True, True, True], 
                       [True, None, True]])
    df.columns= ['A', 'B', 'C']
    df

因此,您将有:

        A   B   C
    0   True    True    False
    1   True    True    True
    2   True    None    True

然后,您可以定义一个函数来按行应用于列集合。例如,如果列表中没有一个,则返回None,或者执行。你可以很容易地适应你的情况

    def all_true(x):
        y = True
        for i in x:
            if(type(i) != bool):
                return None
            y &= i
        
        return y

所以这将返回False:

   all_true([False, True, False])

现在,如果将此函数应用于df

    df.apply(all_true, axis = 1)

你会有

    0    False
    1     True
    2     None
    dtype: object

使用^{}测试^{}中至少一个值Yes,然后测试^{}是否错误显示了所有值:

#columns for test, in real data 14 columns names
cols = ['A','B','C']
m1 = dfMSR[cols].eq('Yes').any(axis=1)
m2 = dfMSR[cols].isna().all(axis=1)

dfMSR['D'] = np.select([m1, m2], [True, 'Invalid'], default=False)
print (dfMSR)
     A    B    C        D
1  NaN  NaN  NaN  Invalid
2  Yes  Yes  NaN     True
3   No  Yes  Yes     True
4   No  Yes  Yes     True
5   No   No  NaN    False

首先尝试检查nan,然后检查YES。然后使用np.select

df['D'] = np.select((df.isna().all(1), df.eq('Yes').any(1)),
                    ('Invalid', True), False)

输出:

     A    B    C        D
1  NaN  NaN  NaN  Invalid
2  NaN  Yes  Yes     True
3   No  Yes  Yes     True
4   No  Yes  Yes     True
5   No   No  NaN    False

相关问题 更多 >