我对 python 和 pandas 仍然很陌生,想知道是否有更好的方法来解决我遇到的索引问题。因为我看到人们在这个网站上做了非常巧妙的事情,超出了我通常可以从文档中收集到的内容,所以我想我会问——特别是因为我还在学习。
我有一个包含多个列的 DataFrame级别,级别 0 是“meta”和“rna”,级别 1 是“meta”下的“subject_id”、“疾病”、“时间”和“状态”,“rna”下有数千个 EnsemblGeneID。对我来说,如果我想要“元”列的特定子集和所有“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是完全错误的,我应该做其他事情。
可以使用 Pandas 中的多索引选择来实现这一点,而无需列出所有“rna”列。以下是如何操作:
selected_columns = df.loc[:, (slice(None), ('subject_id', 'status', slice(None)))]
这行代码的作用如下:
-
df.loc[:, (..., ...)]
:我们使用.loc
进行基于标签的选择,并在第一个位置使用:
选择所有行。第二个位置用于列选择,我们将使用一个元组来指定多索引级别。 -
(slice(None), ('subject_id', 'status', slice(None)))
:此元组表示列的选择。-
slice(None)
:第一个slice(None)
选择级别 0 中的所有内容(在本例中为“meta”和“rna”)。 -
('subject_id', 'status', slice(None))
:这部分选择级别 1 中的列。-
'subject_id'
和'status'
明确选择这些列。 -
slice(None)
选择级别 1 下的所有“rna”列。
-
-
这种方法比列出所有“rna”列更简洁、更高效,尤其是在有数千列的情况下。它利用了多索引切片的功能来选择所需的列子集。
标签:python,pandas,dataframe,bioinformatics From: 78800337