Python Pandas 使用 .loc 跨列级别进行多重索引

问题描述 投票:0回答:1

我对 python 和 pandas 仍然很陌生,想知道是否有更好的方法来解决我遇到的索引问题。因为我看到人们在这个网站上做了非常巧妙的事情,超出了我通常可以从文档中收集到的内容,所以我想我会问——特别是因为我还在学习。

我有一个具有多个列级别的 DataFrame,级别 0 是“meta”和“rna”,级别 1 是“meta”下的“subject_id”、“疾病”、“时间”和“状态”,以及数千个列EnsemblGeneID 位于“rna”下。对我来说,如果我想要“meta”列的特定子集和所有“rna”列,我只需将元组列表传递给

df.loc[]
:

selected_columns = df.loc[:, [("meta", "subject_id"), ("meta", "status"), ("rna",:)]]

但这不起作用,根据文档,似乎没有什么比这更优雅的了。有谁知道执行此操作的时尚方法吗?

我尝试了各种将东西传递给

df.loc[]
进行实验的方法,但大多数都因各种按键错误、切片错误等而出错,而且我能得到的工作并不像可能的那么优雅。仍在尝试弄清楚是否可以使用索引器,但这与单级 dfs 相比似乎过于复杂。

我发现最有效的方法是 ChatGPT 建议的:

selected_columns = df.loc[:, [('meta', 'subject_id'), ('meta', 'status')] + [('rna', col) for col in df['rna'].columns]]

也许这已经很巧妙了,但这并不像单级 DataFrame 的工作方式那么直观,而且我之前在这里看到过一些魔法,所以想在这里尝试一下。另外,也许一些经验丰富的 Python 开发人员可以告诉我,尝试像这样导航 DataFrame 是完全错误的,我应该做其他事情。

python pandas dataframe bioinformatics
1个回答
0
投票

所以这条线有两个问题:

selected_columns = df.loc[:, [("meta", "subject_id"), ("meta", "status"), ("rna",:)]]

第一只熊猫不认识

df.loc [:, ("rna", :)]
。正确的语法是
df.loc [:,"rna"]
。第二个问题来自索引的维度/级别:
df.loc [:, ("rna", :)]
将返回一个数据帧,这是合乎逻辑的,因为您将有多个列,而使用
df.loc [:, ("meta", "subject_id")]
,我们有一个系列,因为我们“完全索引”列(我们指定哪个级别) 0 和我们感兴趣的 1 级)。因此,即使语法正确,我们也会在 loc 参数中混合不同级别的索引。

为了保持代码的可读性,我建议这样做(这实际上是 ChatGPT 提出的!):

selected_columns_indexes = [("meta", "subject_id"), ("meta", "status")] + [("rna", sub_rna) for sub_rna in df.loc[:, "rna"].columns]
selected_columns = df.loc[:,selected_columns_indexes]
© www.soinside.com 2019 - 2024. All rights reserved.