如何将两个键匹配的字典转为值在相邻列的DataFrame
从匹配键的两个字典生成相邻列DataFrame的解决方法
问题场景
现有两个键完全匹配的字典:
pl = {'seq1' : ['actgcta', 'cggctatcg'], 'seq2': ['cgatcgatca'], 'seq3': ['cgatcagt', 'cgataataat']} pr = {'seq1' : ['cagtatacga', 'attacgat', 'atcgactagt'], 'seq2': ['cgatcgatca'], 'seq3': ['cgatcagt']}
需要将它们转换为DataFrame,让每个键对应的两个字典值处于相邻列,期望格式如下:
seq1 |['actgcta','cggctatcg'] |['cagtatacga', 'attacgat', 'atcgactagt'] -------------------------------------------------------------------------- seq2 |['cgatcgatca'] |['cgatcgatca'] -------------------------------------------------------------------------- seq3 |['cgatcagt', 'cgataataat'] |['cgatcagt']
此前尝试pd.DataFrame、pd.DataFrame.from_dict并调整orient参数未成功。
解决方案
可以通过两种简单方式实现需求:
方法1:Series拼接法
利用Pandas Series自动对齐索引的特性,直接拼接两个Series即可:
import pandas as pd # 将字典转为Series,键自动成为行索引 s_pl = pd.Series(pl) s_pr = pd.Series(pr) # 按列拼接两个Series生成DataFrame,并设置列名 df = pd.concat([s_pl, s_pr], axis=1) df.columns = ['pl_values', 'pr_values'] print(df)
输出结果:
pl_values pr_values seq1 [actgcta, cggctatcg] [cagtatacga, attacgat, atcgactagt] seq2 [cgatcgatca] [cgatcgatca] seq3 [cgatcagt, cgataataat] [cgatcagt]
方法2:DataFrame按索引合并
如果偏好使用from_dict,需指定orient='index'将字典键设为行索引,再通过join合并:
import pandas as pd # 按索引创建单个DataFrame,指定列名 df_pl = pd.DataFrame.from_dict(pl, orient='index', columns=['pl_values']) df_pr = pd.DataFrame.from_dict(pr, orient='index', columns=['pr_values']) # 按索引合并两个DataFrame df = df_pl.join(df_pr) print(df)
输出结果与方法1完全一致。
失败原因说明
之前尝试未成功,大概率是orient参数使用错误:
- 若用
orient='columns',字典的键会被当作DataFrame的列名,无法实现按行对齐键的需求; - 必须指定
orient='index'让字典键成为行索引,才能保证两个字典的键对应到同一行,进而实现相邻列的布局。
内容的提问来源于stack exchange,提问作者bhumm
相关产品推荐
相关产品推荐

