如何将拆分后的Pandas DataFrame转为BioPandas对象并保存为PDB文件?
问题
我有一个已处理的1asy_pocket.pdb文件,希望基于聚类算法生成的、存储在hlabs变量中的标签,将其进一步处理并拆分为4个不同的文件。我可以用BioPandas处理该文件,但在生成4个Pandas DataFrame后,无法将每个DataFrame保存为独立文件。
我的代码如下:
from biopandas.pdb import PandasPdb import pandas as pd from distances import hlabs pdb = PandasPdb().read_pdb('1asy_pocket.pdb') print(pdb.df.keys()) atoms_df = pdb.df['ATOM'] hetatm_df = pdb.df['HETATM'] atoms = pd.concat([atoms_df, hetatm_df]) print(atoms) series = pd.Series(hlabs, name="labels") data = pd.concat([atoms, series], axis=1) fragments = data.groupby(['labels']) groups = [] names = [] for name, group in fragments: print(group.shape) group = pd.DataFrame(group) group = group.drop(['labels'], axis=1) groups.append(group) names.append(name) numbers = range(0, len(groups)) numbers = list(map(str, numbers)) print(numbers) for x, y in zip(groups, numbers): x.to_pdb(path='file'+y+'.pdb', records=['ATOM', 'HETATM'])
报错信息如下:
File "/hdda/mihai/first_model/pdb_test/april_test/pockets/./bpd.py", line 35, in <module> x.to_pdb(path='file'+y+'.pdb', ^^^^^^^^ File "/hdda/mihai/miniconda/pytorch_env/lib/python3.13/site-packages/pandas/core/generic.py", line 6321, in __getattr__ return object.__getattribute__(self, name) ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^ AttributeError: 'DataFrame' object has no attribute 'to_pdb'. Did you mean: 'to_hdf'?
请问是否可以将这4个DataFrame转换为BioPandas对象?
解决方案
可以将拆分后的DataFrame转换为BioPandas的PandasPdb对象,核心是为每个分组数据创建新的PandasPdb实例,填充对应字段后再保存。
修改后的代码如下:
from biopandas.pdb import PandasPdb import pandas as pd from distances import hlabs pdb = PandasPdb().read_pdb('1asy_pocket.pdb') atoms_df = pdb.df['ATOM'] hetatm_df = pdb.df['HETATM'] atoms = pd.concat([atoms_df, hetatm_df]) series = pd.Series(hlabs, name="labels") data = pd.concat([atoms, series], axis=1) fragments = data.groupby(['labels']) for idx, (name, group) in enumerate(fragments): # 移除标签列 group = group.drop(['labels'], axis=1) # 新建PandasPdb对象 new_pdb = PandasPdb() # 拆分回ATOM和HETATM(还原之前的合并操作) new_pdb.df['ATOM'] = group[group['record_name'] == 'ATOM'] new_pdb.df['HETATM'] = group[group['record_name'] == 'HETATM'] # 保存为独立PDB文件 new_pdb.to_pdb(path=f'file{idx}.pdb', records=['ATOM', 'HETATM'])
关键修改点:
- 直接遍历
groupby结果处理每个分组,无需额外收集分组列表 - 为每个分组创建空的
PandasPdb实例,符合BioPandas的操作要求 - 将合并后的分组数据重新拆分回
ATOM和HETATM,填充到新对象的对应字段中 - 调用
PandasPdb对象的to_pdb方法保存,避免DataFrame无此方法的报错
内容的提问来源于stack exchange,提问作者User240326
相关产品推荐
相关产品推荐

