1 1 0 0 0 1 0 0 0
0 1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1
1 0 0 1 1 0 0 0 0
我有一个上述结构的数据框。我希望得到列总和为1的列。如果列为同一行,则列应该组合在一起。因此,如果我们看到上面的示例,我们应该将列[3],[4,5],[6],[7,8,9]
作为输出。我试着做df.columns[df.sum(axis=0) == 1]
但不是把它们放在一起(当它们有相同的行时)我将它们作为个体...
答案 0 :(得分:2)
您可以创建sub_df
,其中列总和为1:
sub_df = df.loc[:, df.sum()==1]
sub_df
Out[105]:
2 3 4 5 6 7 8
0 0 0 0 1 0 0 0
1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
3 1 0 0 0 0 0 0
4 0 0 0 0 1 1 1
5 0 1 1 0 0 0 0
然后将这些列按1的位置(最大位置)分组:
sub_df.groupby(sub_df.idxmax(), axis = 1).groups
Out[107]: {0: [5], 3: [2], 4: [6, 7, 8], 5: [3, 4]}
结果是字典。您可以按dict.values()
:
d = sub_df.groupby(sub_df.idxmax(), axis = 1).groups
d.values()
Out[110]: dict_values([[5], [2], [6, 7, 8], [3, 4]])
我的示例中的列名是从零开始的数字。您可以遍历字典以将1添加到这些值。
答案 1 :(得分:2)
s = df.loc[:, df.sum(axis=0) == 1].idxmax(axis=0)
[[int(j) for j in i] for i in s.groupby(s).groups.values()]
看起来像:
[[5], [2], [6, 7, 8], [3, 4]]
编辑:
这与ayhan的答案基本相同。他/她之后我发布了2秒钟。我离开这里是因为我处理了将long int转换为int。请选择他/她对我的回答。