Python中Dataframe转置、值映射及两样本t检验前置操作问题求助
解决你的双样本t检验数据映射问题
让我们一步步梳理你的问题,先理清数据结构和代码里的核心问题:
问题根源分析
- 最初的KeyError问题:你转置
project.csv后,原数据里的TaxID是原DataFrame的行索引,转置后它变成了新DataFrame的列名,而新DataFrame的行索引是原来的样本ID(比如PRJEB3251_ERR169499)。这时候你去访问df_kraken['TaxID']自然会报错——这个列根本不存在。 - 调整后的映射错误:你在
df['Meta ID']这一行写反了映射逻辑,应该用df_meta里的SRA ID匹配你拆分出的KEY,然后取出对应的(0/1)值,而不是用不存在的df['(Project ID)']来做映射。
修正后的完整代码
import pandas as pd # 处理project.csv:读取、转置并整理样本ID列 df_project = pd.read_csv('project.csv') # 假设原project.csv结构是:TaxID, 样本1, 样本2, ... df_project.set_index('TaxID', inplace=True) # 转置后把原样本列名从索引转成普通列,并重命名为Project ID df_kraken = df_project.T.reset_index().rename(columns={'index': 'Project ID'}) # 处理Meta3251.csv:构建SRA ID到(0/1)的映射字典 df_meta = pd.read_csv( 'Meta3251.csv', delimiter=',', dtype={'(0/1)': int}, # 把0/1设为整数更适合后续统计分析 usecols=['SRA ID', '(0/1)'] ) # 生成映射字典:键是SRA ID,值是对应的分组标签0/1 meta_mapping = df_meta.set_index('SRA ID')['(0/1)'].to_dict() # 从Project ID中提取SRA ID(比如从PRJEB3251_ERR169499拆分出ERR169499) df_kraken['SRA ID'] = df_kraken['Project ID'].str.split('_').str[1] # 完成0/1值的映射 df_kraken['Meta (0/1)'] = df_kraken['SRA ID'].map(meta_mapping) # 可选:删除中间的SRA ID列(如果不需要保留的话) # df_kraken.drop('SRA ID', axis=1, inplace=True) # 保存处理好的数据到CSV df_kraken.to_csv('R.csv', index=False)
关键步骤解释
- 转置与索引整理:转置后用
reset_index()把原样本ID从行索引转成普通列,避免后续操作时混淆索引和列。 - 映射字典构建:把
df_meta转换成字典形式,让map()方法可以快速匹配SRA ID对应的0/1值,比直接用replace()更直观。 - SRA ID提取:用字符串拆分方法
str.split('_').str[1]精准提取出和df_meta匹配的SRA ID部分。 - 映射赋值:通过
map(meta_mapping)把分组标签0/1填充到新列,这样你就可以用这个列来分组做双样本t检验了。
预期结果示例
处理后的R.csv结构大概是这样:
Project ID,333046,1049,337090,SRA ID,Meta (0/1) PRJEB3251_ERR169499,0.05,0.03,0.01,ERR169499,1 PRJEB3251_ERR169500,0,0,0,ERR169500,0 PRJEB3251_ERR169501,0,0,0,ERR169501,1 ...
内容的提问来源于stack exchange,提问作者K.S
相关产品推荐
相关产品推荐

