按照列表顺序对pandas DataFrame进行排序

9
我有一个名为df的pandas DataFrame,其中的列代表分类学分类(即王国、门、纲等)。我还有一个分类标签列表,这些标签对应着我希望DataFrame按顺序排序的顺序。
该列表如下所示:
class_list=['Gammaproteobacteria', 'Bacteroidetes', 'Negativicutes', 'Clostridia', 'Bacilli', 'Actinobacteria', 'Betaproteobacteria', 'delta/epsilon subdivisions', 'Synergistia', 'Mollicutes', 'Nitrospira', 'Spirochaetia', 'Thermotogae', 'Aquificae', 'Fimbriimonas', 'Gemmatimonadetes', 'Dehalococcoidia', 'Oscillatoriophycideae', 'Chlamydiae', 'Nostocales', 'Thermodesulfobacteria', 'Erysipelotrichia', 'Chlorobi', 'Deinococci']

这个列表对应于Dataframe的列df['Class']。我想根据列表的顺序对整个数据框进行排序,因为df['Class']目前的顺序不同。最好的方法是什么?
2个回答

22
你可以将Class列作为索引列。
df = df.set_index('Class')

然后使用df.loc将DataFrame重新索引为class_list

df.loc[class_list]

最简例子:

>>> df = pd.DataFrame({'Class': ['Gammaproteobacteria', 'Bacteroidetes', 'Negativicutes'], 'Number': [3, 5, 6]})
>>> df
                 Class  Number
0  Gammaproteobacteria       3
1        Bacteroidetes       5
2        Negativicutes       6

>>> df = df.set_index('Class')
>>> df.loc[['Bacteroidetes', 'Negativicutes', 'Gammaproteobacteria']]
                     Number
Bacteroidetes             5
Negativicutes             6
Gammaproteobacteria       3

4
为了更好的通用性,在重新索引步骤中使用 df = df.reindex(some_list),请参见此处。虽然 DataFrame.loc[] 主要是基于标签进行操作,但也可以与布尔数组一起使用,详见此处。因此,如果索引最终变成布尔类型,并且您尝试使用 df = df.loc[[True,False]] 进行重新索引,那么您将会抛出第二行数据。请参见 https://dev59.com/zV0a5IYBdhLWcg3wuKs7#30010004。 - Wayne

8

Alex的解决方案如果您的原始数据框中不包含有序列表中的所有元素,即:如果您的输入数据在某个时间点上不包含"Negativicutes",则此脚本将失败。解决方法之一是将您的df(数据框)附加到列表中,并在最后进行连接。例如:

ordered_classes = ['Bacteroidetes', 'Negativicutes', 'Gammaproteobacteria']

df_list = []

for i in ordered_classes:
   df_list.append(df[df['Class']==i])

ordered_df = pd.concat(df_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接