在python

时间:2016-05-23 22:57:06

标签: python pandas dataframe

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]但不是把它们放在一起(当它们有相同的行时)我将它们作为个体...

2 个答案:

答案 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。请选择他/她对我的回答。