如何将列与 pandas 中的虚拟变量组合(一个输出)?

How to combine columns with dummy variables in pandas (one output)?

给定以下数据框和虚拟变量。如何组合或折叠两个或多个列以创建一个新列,如果一个或多个列具有 1,则该列具有 1,如果 NONE 个列具有 1,则具有 0。

data = {'cat_1': [1, 0, 1, 1, 0], 'cat_2':[1, 0, 0, 1, 1], 'cat_3':[0, 0, 1, 1, 1], 'cat_4':[1, 1, 1, 0, 0]}
df=pd.DataFrame(data, index=['s1', 's2', 's3', 's4', 's5'])
df

   cat_1  cat_2  cat_3  cat_4
s1      1      1      0      1
s2      0      0      0      1
s3      1      0      1      1
s4      1      1      1      0
s5      0      1      1      0

我希望输出看起来像这样:

data2 = {'cat_1_cat_2 combined': [1, 0, 1, 1, 1], 'cat_3_cat_4 combined':[1, 1, 1, 1, 1]}
new_df=pd.DataFrame(data2, index=['s1', 's2', 's3', 's4', 's5'])
print(new_df)

    cat_1_cat_2 combined  cat_3_cat_4 combined
s1                     1                     1
s2                     0                     1
s3                     1                     1
s4                     1                     1
s5                     1                     1

执行此操作的一种方法如下:

将0:s替换为nan,例如cat_2cat_3

df['cat_2'] = np.where(df['cat_2'],1,np.nan)
df['cat_4'] = np.where(df['cat_4'],1,np.nan)

给出:

cat_1  cat_2  cat_3  cat_4
s1      1    1.0      0    1.0
s2      0    NaN      0    1.0
s3      1    NaN      1    1.0
s4      1    1.0      1    NaN
s5      0    1.0      1    NaN

然后合并它们:

df["combined 1 and 2 "] = df.pop("cat_2").fillna(df.pop("cat_1")).astype(int)
df["combined 3 and 4 "] = df.pop("cat_4").fillna(df.pop("cat_3")).astype(int)

哪个 return 你期望的 df:

combined 1 and 2   combined 3 and 4 
s1                  1                  1
s2                  0                  1
s3                  1                  1
s4                  1                  1
s5                  1                  1

或者,

df['combined 1 and 2'] = (df.cat_1 | df.cat_2).astype(int)
df['combined 3 and 4'] = (df.cat_3 | df.cat_4).astype(int)
df = df.drop(['cat_1','cat_2','cat_3','cat_4'], axis =1)