如何按DataFrame首行值拆分生成多个独立子数据框
按DataFrame首行值拆分亚组数据框实现方法
需求说明
需要基于DataFrame第一行的取值拆分数据,生成4个独立的数据框用于亚组分析:
- 源数据为172×106规格的Excel文件,未设置列表头
- 第一行取值仅为1、2、3、4,其余171行为影像组学特征
- 需要将对应列的特征复制到新数据集
数据样例如下:
{0: [4.0, 0.65555056, 0.370511262, 16.5876203, 44.76954415, 48.0, 32.984845, 49.47726751, 49.47726751, 13133.33333, 29.34869973, 0.725907513, 3708.396349, 0.282365204, 13696.0, 2.122884402, 3.039611259, 1419.058749, 1.605529827, 0.488297449], 1: [2.0, 0.82581372, 0.33201741, 20.65753167, 62.21821817, 50.59644256, 62.60990337, 55.56977596, 77.35631842, 23890.66667, 51.38065822, 0.521666786, 7689.706847, 0.321870752, 25152.0, 1.022813615, 1.360453239, 548.2156387, 0.314035581, 0.181204079]}
原有代码报错原因
原实现使用groupby拆分,运行触发KeyError: '1',核心问题有2个:
- 第一行的分组值读入后为浮点型(样例中可见为4.0、2.0),代码传入字符串
"1"匹配分组,类型不匹配无法找到对应分组 - 转置后分组的逻辑未做最终结构还原,即使匹配到分组,得到的也是转置后的结构,和原数据行列逻辑不一致
原有代码如下:
import numpy as np df = pd.read_excel(r'H:\Documenten\MATLAB\sample_file.xlsx',header=None) Class_1=df.groupby(df.T.loc[:,0]) df_new = Class_1.get_group("1") print(df_new)
报错信息如下:
Traceback (most recent call last): File "H:/PycharmProjects/RadiomicsPipeline/spearman_subgroups.py", line 5, in <module> df_new = Class_1.get_group("1") File "C:\Users\cpullen\AppData\Roaming\Python\Python37\site-packages\pandas\core\groupby\groupby.py", line 754, in get_group raise KeyError(name) KeyError: '1'
正确实现方案
方案1:直接按列筛选(逻辑最简单,推荐)
不需要调用groupby,直接提取第一行作为分组标签,按标签筛选对应列即可:
import pandas as pd # 读取无表头Excel数据 df = pd.read_excel(r'H:\Documenten\MATLAB\sample_file.xlsx', header=None) # 提取第一行作为分组标签 group_tags = df.iloc[0, :] # 拆分得到4个亚组数据框,默认保留首行分组标签 df_group1 = df.loc[:, group_tags == 1.0] df_group2 = df.loc[:, group_tags == 2.0] df_group3 = df.loc[:, group_tags == 3.0] df_group4 = df.loc[:, group_tags == 4.0] # 如果不需要首行标签,只保留特征行,替换为以下写法 # df_group1 = df.loc[:, group_tags == 1.0].iloc[1:, :]
方案2:修正groupby逻辑
如果需要沿用groupby写法,修正匹配类型和转置逻辑即可:
import pandas as pd df = pd.read_excel(r'H:\Documenten\MATLAB\sample_file.xlsx', header=None) # 转置后按首行整数值分组,分组完成后转置回原行列结构 grouped = df.T.groupby(df.iloc[0, :].astype(int)) df_group1 = grouped.get_group(1).T df_group2 = grouped.get_group(2).T df_group3 = grouped.get_group(3).T df_group4 = grouped.get_group(4).T
注意:分组匹配时必须保证传入的键类型和分组标签类型一致,要么直接匹配浮点型数值
1.0,要么先把标签转为整数型再匹配整数1,禁止用字符串"1"匹配数值型标签。
内容的提问来源于stack exchange,提问作者Lieke Pullen
相关产品推荐
相关产品推荐

