python - 根据列名获取 pandas 数据框的子集

标签 python regex pandas

我有一个包含 140 个样本(列)和约 27000 个 SNP(行)的 pd.DataFrame。每个列名称都有一个人口名称加上一个数字(例如 'FLFL04' 或 'MI03' ),其中有 6 个不同的人口和人口中不同数量的样本。

我想根据种群名称提取各个种群的子集进行进一步计算(Hardy-Weinberg 精确检验);我可以用循环和正则表达式来完成,但希望有一个更快的解决方案。 有没有一种方法可以根据列名(而不是它们的内容)创建子集?

编辑: 我目前的做法如下:

(任何 pd.DataFrame 都可以,具有以下列:

data.columns = ['FLFL04', 'FLFL08', 'FLFL08replicate', 'FLFL10', 'FLFL13', 'FLFL14', 'FLFL15', 'FLFL15replicate', 'FLFL16', 'FLFL17', 'FLFL17replicate', 'FLFL19', 'FLFL20', 'FLFL20replicate', 'FLFL21', 'FLFL23', 'FLFL26', 'FLFL28', 'FLFL28replicate', 'FLFL29', 'FLFL29replicate', 'FLFL30', 'HSPQ01', 'HSPQ01replicate', 'HSPQ01replicate2', 'HSPQ02', 'HSPQ02replicate', 'HSPQ02replicate2', 'HSPQ03', 'HSPQ04', 'HSPQ04replicate', 'HSPQ04replicate2', 'HSPQ06', 'HSPQ07', 'HSPQ08', 'HSPQ09', 'HSPQ09replicate', 'HSPQ10', 'HSPQ10replicate', 'HSPQ11', 'HSPQ12', 'HSPQ13', 'HSPQ14', 'HSPQ15', 'HSPQ16', 'HSPQ17', 'HSPQ18', 'HSPQ19', 'HSPQ21', 'HSPQ22', 'HSPQ22replicate', 'KFO1', 'KFO2', 'KFO3', 'KFO4', 'KFO5', 'KFO8', 'MI01', 'MI02', 'MI03', 'MI03replicate', 'MI03replicate2', 'MI04', 'MI05', 'MI06', 'MI06replicate', 'MI06replicate2', 'MI08', 'MI09', 'MI09replicate', 'MI09replicate2', 'MI10', 'MI11', 'MI12', 'MI12replicate', 'MI13', 'MI13replicate', 'MI14', 'MI15', 'MI16', 'MI16replicate', 'MI17', 'MI18', 'MI19', 'MI20', 'MI21', 'SFQ01', 'SFQ02', 'SFQ03', 'SFQ03replicate', 'SFQ05', 'SFQ05replicate', 'SFQ06', 'SFQ06replicate', 'SFQ07', 'SFQ08', 'SFQ08replicate', 'SFQ09', 'SFQ09replicate', 'SFQ10', 'SFQ10replicate', 'SFQ11', 'SFQ13', 'SFQ14', 'SFQ15', 'SFQ16', 'SFQ17', 'SFQ21', 'SFQ23', 'SFQ24', 'SFQ25', 'SFQ26', 'WWA01', 'WWA01replicate', 'WWA01replicate2', 'WWA03', 'WWA03replicate', 'WWA03replicate2', 'WWA04', 'WWA05', 'WWA05replicate', 'WWA05replicate2', 'WWA07', 'WWA08', 'WWA08replicate', 'WWA09', 'WWA10', 'WWA12', 'WWA17', 'WWA17replicate', 'WWA18', 'WWA21', 'WWA23', 'WWA24', 'WWA25', 'WWA25replicate', 'WWA26', 'WWA27', 'WWA28', 'WWA30']

def get_pop_subset(pop_list, pop_name): 
    pop_result_list = []
    for i, pop in enumerate(data.columns):
    curr_pop = re.findall('([A-Z]+)', pop)[0]
    if curr_pop == pop_name:
        pop_result_list.append(pop)
    return pop_result_list

pops = ['FLFL', 'HSPQ', 'KFO', 'MI', 'SFQ', 'WWA']
subsets = []
for val in pops:
    subsets.append(get_pop_subset(data.columns, val))

for val in subsets:
    print data[val]

然后我调用其他函数而不是

    print data[val]

并将每个追加到一个新的 df。 虽然这可行,但我希望得到一个更快、可能更有效的解决方案

谢谢, 马丁

最佳答案

使用带有参数“regex”的内置 DataFrame 方法“filter”难道不能达到同样的目的吗?例如,

df2 = df.filter(regex='FLFL')

返回一个新的 DataFrame,其中所有列都以 FLFL 开头。

关于python - 根据列名获取 pandas 数据框的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16126614/

相关文章:

python - 如何聚合这些数据并使用 python 和 pandas 创建一个新列?

Python,RGB颜色比较

python - Tkinter 按钮在我的 Mac 上不显示文本,尽管代码在其他计算机上有效

python - 移动文件并覆盖 Windows 上 Python 3.6 中的现有文件

javascript - 电子邮件地址正则表达式验证

c# - 提取数据的正则表达式

javascript - 限制正斜杠的指令

python - 通过整数索引选择和修改 Pandas 数据框中的切片

python - 在 Python 中将每月数据转换为每日数据

python - 与 Pandas 的对应表