首页 > 解决方案 > Python Pandas:根据单元格中的值重复列名

问题描述

我有以下数据框

import pandas as pd
dfx = pd.DataFrame({'A': [100, 100, 100, 102, 102],
                    'B': [1, 2, 3, 0, 0],'C': [0, 2, 1, 0, 0],'D': [0, 0, 4, 1, 0]
                   })
print(dfx)

     A  B  C  D
0  100  1  0  0
1  100  2  2  0
2  100  3  1  4
3  102  0  0  1
4  102  0  0  0

从这个数据框中,我可以获取所有值 > 0 的列并将其放入列表中。这给出了唯一值的列表:

cols = dfx[['B', 'C', 'D']].columns
dfx['list_of_cols'] = dfx[['B', 'C', 'D']].apply(lambda x: x > 0, raw=True).apply(lambda x: list(cols[x.values]), axis=1)
print(dfx)

     A  B  C  D list_of_cols
0  100  1  0  0          [B]
1  100  2  2  0       [B, C]
2  100  3  1  4    [B, C, D]
3  102  0  0  1          [D]
4  102  0  0  0           []

但我希望列名重复与单元格中存在的值一样多的次数。我正在寻找的输出是这样的:

     A  B  C  D   list_of_cols_1            list_of_cols_2
0  100  1  0  0            [1xB]                       [B]
1  100  2  2  0       [2xB, 2xC]              [B, B, C, C]
2  100  3  1  4  [3xB, 1xC, 4xD]  [B, B, B, C, D, D, D, D]
3  102  0  0  1            [1xD]                       [D]
4  102  0  0  0               []                        []

我该怎么做呢?

标签: pythonpandas

解决方案


你可以试试dot

s=df.loc[:,'B':]
df['New Col']=s.dot(s.columns+',').str.split(',').str[:-1]

Out[70]: 
0                         [B]
1                [B, B, C, C]
2    [B, B, B, C, D, D, D, D]
3                         [D]
4                          []
dtype: object

推荐阅读