2016-11-08 66 views
3

我有大量的csv数据文件,其中有1000列,我希望将所有行拆分为所谓的类。 'class'在同一个地方包含有零和非零的行。用熊猫或numpy将数据拆分为'类'

例如: 文件:

0 ,0,0.1,0.2,0 
0.9,0,0.3,0.2,0 
0 ,0,0.8,0.2,0 
0 ,0,0.2,0 ,0 
0 ,0,0.1,0.2,0 

将分裂到三类:行1,3,5; 2行;第4行。

如何以有效的方式使用熊猫或numpy完成这项工作?

回答

1

你能做到这样:

In [38]: dfs = [] 
    ...: for _, g in df.groupby(((df == 0)*1).astype(str).sum(axis=1)): 
    ...:  print(g) 
    ...:  dfs.append(g) 
    ...: 
    0 1 2 3 4 
1 0.9 0 0.3 0.2 0 
    0 1 2 3 4 
0 0.0 0 0.1 0.2 0 
2 0.0 0 0.8 0.2 0 
4 0.0 0 0.1 0.2 0 
    0 1 2 3 4 
3 0.0 0 0.2 0.0 0 

In [39]: dfs 
Out[39]: 
[  0 1 2 3 4 
1 0.9 0 0.3 0.2 0,  0 1 2 3 4 
0 0.0 0 0.1 0.2 0 
2 0.0 0 0.8 0.2 0 
4 0.0 0 0.1 0.2 0,  0 1 2 3 4 
3 0.0 0 0.2 0.0 0] 

检查:

In [44]: [x.index.tolist() for x in dfs] 
Out[44]: [[1], [0, 2, 4], [3]] 

说明:

In [40]: df == 0 
Out[40]: 
     0  1  2  3  4 
0 True True False False True 
1 False True False False True 
2 True True False False True 
3 True True False True True 
4 True True False False True 

In [41]: ((df == 0)*1) 
Out[41]: 
    0 1 2 3 4 
0 1 1 0 0 1 
1 0 1 0 0 1 
2 1 1 0 0 1 
3 1 1 0 1 1 
4 1 1 0 0 1 

In [42]: ((df == 0)*1).astype(str).sum(axis=1) 
Out[42]: 
0 11001.0 
1  1001.0 
2 11001.0 
3 11011.0 
4 11001.0 
dtype: float64 
1
  • 找出df为零
  • 假设这是一个二进制数,并且每个类都是不同的数字。有五列,应该有32个可能的班级。
  • 使用熊猫groupby归类为我们

g = df.groupby(df.eq(0).dot(1 << np.arange(5))) 

表明它的工作原理

for name, group in g: 
    print(name) 
    print(group) 
    print('') 

18 
    0 1 2 3 4 
1 0.9 0 0.3 0.2 0 

19 
    0 1 2 3 4 
0 0.0 0 0.1 0.2 0 
2 0.0 0 0.8 0.2 0 
4 0.0 0 0.1 0.2 0 

27 
    0 1 2 3 4 
3 0.0 0 0.2 0.0 0