如何在Pandas中将多次出现的二进制列转换为分类数据

6vl6ewon  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(120)

我有以下示例数据集
| A类|乙|C级|D级|
| - ------| - ------| - ------| - ------|
| 富|无|1个|1个|
| 棒|无|无|1个|
| 巴兹|1个|1个|无|
如何提取一行中每1个匹配项的列名,并将其放入另一列E中,这样我就得到了下表:
| A类|乙|C级|D级|E级|
| - ------| - ------| - ------| - ------| - ------|
| 富|无|1个|1个|C、D|
| 棒|无|无|1个|D级|
| 巴兹|1个|1个|无|B、C类|
注意,每行可以有两个以上的1。

nimxete2

nimxete21#

您可以使用DataFrame.dot

df['E'] = df[['B', 'C', 'D']].dot(df.columns[1:] + ', ').str.rstrip(', ')
df

     A  B  C  D     E
0  foo  0  1  1  C, D
1  bar  0  0  1     D
2  baz  1  1  0  B, C

灵感来自于jezrael在post中的回答。
另一种方法是将每一行转换为布尔值,并将其用作筛选列名的选择掩码。

cols = pd.Index(['B', 'C', 'D'])

df['E'] = df[cols].astype('bool').apply(lambda row: ", ".join(cols[row]), axis=1)
df

     A  B  C  D     E
0  foo  0  1  1  C, D
1  bar  0  0  1     D
2  baz  1  1  0  B, C

相关问题