python - Pandas - 按列分组并将数据转换为 numpy 数组
问题描述
具有以下数据框,A 组有 4 个样本,B 有 3 个样本,C 有 1 个样本:
group data_1 data_2
0 A 1 4
1 A 2 5
2 A 3 6
3 A 4 7
4 B 1 4
5 B 2 5
6 B 3 6
7 C 1 4
我想将数据转换为 numpy 数组,其中每一行是一个包含所有样本的组,对于样本较少的组,填充为零。
产生一个像这样的数组:
[
[[1,4],[2,5],[3,6],[4,7]], # this is A group 4 samples
[[1,4],[2,5],[3,6],[0,0]], # this is B group 3 samples
[[1,4],[0,0],[0,0],[0,0]], # this is C group 1 sample
]
解决方案
首先是需要添加缺失值 - 使用 and 的第一个解决方案unstack
,stack
计数器系列由cumcount
.
第二种解决方案reindex
由MultiIndex
.
最后使用 lambda 函数groupby
,转换为 numpy 数组values
,最后转换为列表:
g = df.groupby('group').cumcount()
L = (df.set_index(['group',g])
.unstack(fill_value=0)
.stack().groupby(level=0)
.apply(lambda x: x.values.tolist())
.tolist())
print (L)
[[[1, 4], [2, 5], [3, 6], [4, 7]],
[[1, 4], [2, 5], [3, 6], [0, 0]],
[[1, 4], [0, 0], [0, 0], [0, 0]]]
另一种解决方案:
g = df.groupby('group').cumcount()
mux = pd.MultiIndex.from_product([df['group'].unique(), g.unique()])
L = (df.set_index(['group',g])
.reindex(mux, fill_value=0)
.groupby(level=0)['data_1','data_2']
.apply(lambda x: x.values.tolist())
.tolist()
)
推荐阅读
- php - 我想显示当前时间不在(column)start_time和end_time(column)之间的所有人员记录
- dart - 无法在 onDismissible 中删除
- xml - 将 XML 模式元素引用到与值相同的 XML 模式元素中
- nim-lang - 如何以编程方式获取 nim 编译器版本?
- csv - 当分隔符是列值的一部分时,在 Unix 中计算文件的列数
- elm - 如何使用 elm reactor 通过 http 请求访问文件?
- javascript - 使用基本编码和 iframe 在页面中显示 Excel 文件
- python - OpenCV:去噪对象跟踪
- javascript - aws javascript sdk 函数用于修改 s3 中文件上的现有标签
- c# - 从 Azure Functions V2 定位 Net Framework 库