首页 > 解决方案 > 熊猫水平折叠数据框

问题描述

我对布尔值表有以下内容:

df1 = pd.DataFrame(data={'w': [True, False, False], 
                         'x': [False, True, False],
                         'y': [True, True, True],
                         'z': [True, False, True]},
                         index=pd.Series([1, 2, 3], name='index'))
指数 w X 是的 z
1 真的 错误的 真的 真的
2 错误的 真的 真的 错误的
3 错误的 错误的 真的 真的

我创建了一个与以下宽度相同的新表df1

pd.DataFrame(columns=[f'column{num}' for num in range(1, len(df1.columns) + 1)])
第 1 列 第 2 列 第 3 列 第 4 列

我想要做的是折叠列,df1以便对于每一行,我只显示具有 True值的列:

指数 第 1 列 第 2 列 第 3 列 第 4 列
1 w 是的 z 不适用
2 X 是的 不适用 不适用
3 是的 z 不适用 不适用

标签: pythonpandasseriescollapse

解决方案


dot使用and的一种方法str.split

import numpy as np

df2 = df1.dot(df1.columns+",")
         .str.split(",", expand=True)
         .replace(r'^\s*$', np.nan, regex=True)
         .rename_axis(None)
df2.columns = [f'column{num}' for num in range(1, len(df2.columns)+1)]

>>> df2

    column1 column2 column3 column4
1         w       y       z     NaN
2         x       y     NaN     NaN
3         y       z     NaN     NaN

推荐阅读