根据条件匹配的其他列中的行值更新列

时间:2021-06-23 12:05:22

标签: python pandas dataframe isin

我需要根据其他列中包含的值,用更新的值替换以 _4 结尾的列中的值。如果前 3 列包含 1,则第四列应为零。如果前三列包含零,则第四列应为 1。

在我下面的代码中,我想将此计数变量分配为与公共列(即 a 或 b)具有相同的名称 - 然后用这个新的计数列替换原始数据框中的 x'_4' 列 然而,它也没有正确计数,因为 a 和 b 的计数目前是。欢迎提出任何意见。谢谢你

import pandas as pd
import numpy as np 

df = pd.DataFrame({ 'a_1':[1, 0, 0, 0],
                    'a_2':[0, 0, 0, 1],
                    'a_3':[0, 0, 0, 0],
                    'a_4':[1, 0, 1, 1],
                  
                    'b_1':[0, 0, 0, 1],
                    'b_2':[0, 0, 0, 1],
                    'b_3':[1, 1, 0, 0],
                    'b_4':[0, 1, 0, 1]})

我现在的代码是这样的

out = []
counts = []

col_list = ('a','b')

for col in col_list:

    
    d = df.loc[:,df.columns.str.startswith(col)]
    dat = df.loc[:, ~df.columns.str.endswith('4')]
    counts = dat[(dat.isin([1]).any(1).astype(int))|(d.isin([1]).all(0).astype(int))]
    counts^=1
    counts_df = pd.DataFrame(counts)
    out.append(counts_df)

原始数据框中被覆盖的列应如下所示

    a_4 b_4
0   0   0
1   1   0
2   1   1
3   0   0

1 个答案:

答案 0 :(得分:1)

尝试通过 filter() 获取列名,如 '_4'

cols=df.filter(like='_4').columns

最后:

df[cols]=(df.filter(regex='_[0-3]')
            .rename(columns=lambda x:x.split('_')[0])
            .groupby(axis=1,level=0).sum().eq(0).astype(int))

df 的输出:

        a_1     a_2     a_3     a_4     b_1     b_2     b_3     b_4
0       1       0       0       0       0       0       1       0
1       0       0       0       1       0       0       1       0
2       0       0       0       1       0       0       0       1
3       0       1       0       0       1       1       0       0
相关问题