使用 pandas 或 numpy 将数据拆分为“类”

Posted

技术标签:

【中文标题】使用 pandas 或 numpy 将数据拆分为“类”【英文标题】:Split data to 'classes' with pandas or 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 以有效的方式做到这一点?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用 pandas 或 numpy 将数据拆分为“类”的主要内容,如果未能解决你的问题,请参考以下文章

如何将稀疏的 pandas 数据帧转换为 2d numpy 数组

将 Pandas 系列导出为 JSON - numpy 类型错误

使用 pandas 或 numpy 从一个 csv 加载多个数据帧

如何使用for循环创建一定长度的numpy数组(或pandas数据框)?

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

根据观察名称将数据拆分为训练和使用 pandas 进行测试