使用 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数据框)?