【问题标题】:Split data to 'classes' with pandas or numpy使用 pandas 或 numpy 将数据拆分为“类”
【发布时间】:2017-03-21 17:58:14
【问题描述】:

我有大约 1000 列的大型 csv 数据文件,我希望将所有行拆分为所谓的类。 “类”包含在相同位置具有零和非零的行。

例如: 文件:

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 行。

如何使用 pandas 或 numpy 以有效的方式做到这一点?

【问题讨论】:

    标签: python pandas numpy dataframe group-by


    【解决方案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
    

    【讨论】:

      【解决方案2】:
      • 找出df 的位置为零
      • 假设这是一个二进制数,并且每个类别都是不同的数字。有五列,应该有 32 个可能的类。
      • 使用 pandas 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多