如何按列名前缀列表拆分Pandas DataFrame为多个子数据框
按列名前缀拆分Pandas DataFrame实现方法
需求说明
需要根据列名下划线前的PX前缀,将原始DataFrame拆分为多个独立子DataFrame,每个子DataFrame仅包含对应前缀的所有列。
示例原始数据
构造测试数据代码:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0,100,size=(10, 4))) df.columns = ['P1_ATGC', 'P1_GCTA', 'P2_AACT', 'P2_CGAT']
原始数据预览:
| P1_ATGC | P1_GCTA | P2_AACT | P2_CGAT | |
|---|---|---|---|---|
| 0 | 78 | 86 | 47 | 78 |
| 1 | 22 | 48 | 22 | 43 |
| 2 | 91 | 12 | 45 | 10 |
| 3 | 83 | 85 | 9 | 20 |
| 4 | 82 | 26 | 25 | 71 |
| 5 | 13 | 36 | 53 | 19 |
| 6 | 93 | 15 | 30 | 28 |
| 7 | 24 | 13 | 55 | 23 |
| 8 | 10 | 49 | 98 | 45 |
| 9 | 85 | 35 | 77 | 89 |
已通过代码获取到唯一前缀集合:
np.unique([x.split('_')[0] for x in df.columns]) # 输出:array(['P1', 'P2'], dtype='<U2')
目标拆分效果:
- 第1个子表包含所有
P1_开头的列 - 第2个子表包含所有
P2_开头的列
实现代码
方式1:输出为列表(和示例中df[0]、df[1]的索引方式完全匹配)
直接遍历前缀,用str.startswith()匹配对应列做筛选即可:
prefixes = np.unique([x.split('_')[0] for x in df.columns]) split_dfs = [df.loc[:, df.columns.str.startswith(p)] for p in prefixes]
调用方式:
split_dfs[0]返回P1前缀对应的子DataFramesplit_dfs[1]返回P2前缀对应的子DataFrame
方式2:输出为字典(按前缀名索引,更不易出错)
如果后续前缀数量变动,用字典按键取值比列表索引更稳妥:
split_dfs_dict = {p: df.loc[:, df.columns.str.startswith(p)] for p in prefixes}
调用方式:
split_dfs_dict['P1']返回P1前缀对应的子DataFramesplit_dfs_dict['P2']返回P2前缀对应的子DataFrame
说明:
str.startswith()为严格开头匹配,不会出现类似XP1_xxx这类列名被误匹配到P1前缀的问题,比通用字符串包含判断逻辑更严谨。
内容的提问来源于stack exchange,提问作者kas
相关产品推荐
相关产品推荐

