Python 如果行值=1,如何从Dataframe生成列名列表

Python 如果行值=1,如何从Dataframe生成列名列表,python,pandas,Python,Pandas,我有一个熊猫数据框,格式如下 CLASS 1 CLASS 2 CLASS 3 CLASS 4 CLASS 5 CLASS 6 CLASS 7 CLASS 8 CLASS 9 CLASS 10 CLASS 11 CLASS 12 CLASS 13 CLASS 14 CLASS 15 CLASS 16 CLASS 17 CLASS E CLASS V 0 0 0 1 0 0 0 1 0 0 0 0 0 0

我有一个熊猫数据框,格式如下


CLASS 1 CLASS 2 CLASS 3 CLASS 4 CLASS 5 CLASS 6 CLASS 7 CLASS 8 CLASS 9 CLASS 10    CLASS 11 CLASS 12   CLASS 13    CLASS 14    CLASS 15    CLASS 16    CLASS 17    CLASS E CLASS V
0   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0
1   0   0   1   0   0   1   1   1   0   0   0   0   0   0   0   1   0   0   1
2   0   0   1   0   1   0   1   0   1   0   0   0   0   0   0   0   0   0   0
3   0   1   1   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0
4   0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
8944    0   1   1   0   0   1   1   1   0   0   0   0   0   0   0   0   0   0   1
8945    1   0   1   1   0   1   1   1   1   1   0   1   1   0   0   1   1   1   1
8946    0   0   1   1   0   0   1   0   1   0   0   0   0   0   0   0   0   0   1
8947    0   0   1   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0
8948    0   0   1   0   0   1   1   0   0   0   0   0   0   0   0   1   0   0   0


我想为每一行获取一个列表,这样列表就包含了行中的列的名称

例如,对于数据中的第一行,我希望返回列表作为
['CLASS 3'、'CLASS 7']
对于第二行,
['3级'、'6级'、'7级'、'8级'、'16级'、'V级]

提前感谢。

如果有一级多指标,请使用:

print (df.columns)
MultiIndex([( 'CLASS 1',),
            ( 'CLASS 2',),
            ( 'CLASS 3',),
            ( 'CLASS 4',),
            ( 'CLASS 5',),
            ( 'CLASS 6',),
            ( 'CLASS 7',),
            ( 'CLASS 8',),
            ( 'CLASS 9',),
            ('CLASS 10',),
            ('CLASS 11',),
            ('CLASS 12',),
            ('CLASS 13',),
            ('CLASS 14',),
            ('CLASS 15',),
            ('CLASS 16',),
            ('CLASS 17',),
            ( 'CLASS E',),
            ( 'CLASS V',)],
           )


df.columns = df.columns.get_level_values(0)
如果与和一起使用的数据中只有
1
0
值:

或按行筛选:

df['new'] = df.apply(lambda x: x.index[x == 1].tolist(), axis=1)
或根据、fitler by和last create<代码>列表重新塑造每个组:

df['new'] = (df.stack()
               .reset_index(name='val')
               .query('val == 1')
               .groupby('level_0')['level_1']
               .apply(list))

伟大的耶斯雷尔答道。谢谢你的回复。但是,我得到了以下输出0[(3类,),(7类,)]1[(3类,),(6类,),(7类,),(8类,…2[(3类,),(5类,),(7类,),(9类,)]3[(2类,),(3类,),(7类,),(3类,),(8类,)]4[(3类,),(7类,),(5类,)。我需要这样的东西,['CLASS 3'、'CLASS 7']等等。@AdityaVartak-Waht在我的解决方案之前是
print(df.columns)
?我不明白你的意思question@AdityaVartak-能否测试
打印(测向列)
过去的输出有问题吗?因为似乎存在多索引,但不确定我的意思是我不需要多索引列,因此如何删除它们。
df['new'] = (df.stack()
               .reset_index(name='val')
               .query('val == 1')
               .groupby('level_0')['level_1']
               .apply(list))