如何将字典键作为列、值作为行逐行填充pandas DataFrame
问题解决方法
错误根因
你调用pca_df.from_dict()的用法不符合需求:from_dict是pandas的类方法,作用是从字典生成全新的DataFrame对象,不会修改你已有的pca_df,也无法直接给指定行填充数据。
正确实现代码
import pandas as pd from collections import Counter # 模拟你的初始pca_df,实际使用时替换成你自己的初始数据即可 pca_df = pd.DataFrame({ "seqName": ["Wuhan/Hu-1/2019", "sample_1", "sample_2"], "clade": ["19A", "20B", "20A"] }) # 方案1:已知所有可能的突变类型,提前初始化列,效率更高 all_mut_types = ["C>T", "A>G", "G>A", "G>C", "T>C", "C>A", "G>T", "A>T"] for mut in all_mut_types: pca_df[mut] = 0 # 逐行处理逻辑 for line in range(1, len(pca_df)): # 可替换成你原来的range(1,20),匹配实际行数 # 替换为你实际的取值逻辑:substitutions = final_df.iloc[line,2] if line == 1: substitutions = "C241T,C3037T,C14408T,A23403G,C27046T,G28881A,G28882A,G28883C" elif line == 2: substitutions = "C241T,C3037T,C14408T,A23403G,C29144T" # 提取突变类型并统计出现次数 mut_list = [f"{s[0]}>{s[-1]}" for s in substitutions.split(",")] mut_count = Counter(mut_list) # 给当前行对应列赋值 for mut, cnt in mut_count.items(): if mut in pca_df.columns: pca_df.loc[line, mut] = cnt # 输出结果查看 print(pca_df)
可选动态新增列方案
如果你无法提前枚举所有突变类型,需要根据处理结果动态新增列,可以去掉提前初始化列的部分,修改赋值逻辑如下:
for line in range(1, len(pca_df)): # 省略获取substitutions、生成mut_count的相同逻辑 for mut, cnt in mut_count.items(): # 不存在的列先新增,默认值全为0 if mut not in pca_df.columns: pca_df[mut] = 0 pca_df.loc[line, mut] = cnt
核心改动说明
- 用
collections.Counter直接统计突变类型的出现次数,简化代码 - 使用
pca_df.loc[行索引, 列名]的语法修改指定位置的值,这是pandas修改已有DataFrame数据的标准写法 - 新增列时直接给DataFrame赋值新列即可,不需要调用
from_dict方法
内容的提问来源于stack exchange,提问作者user17153595
相关产品推荐
相关产品推荐

