Sorting 按列表顺序对数据帧进行排序
因此,我有一个熊猫数据框架,df,其中的列表示分类分类(即王国、门、类等)。我还有一个分类标签列表,对应于我希望数据框架的排序顺序 列表如下所示:Sorting 按列表顺序对数据帧进行排序,sorting,python-2.7,pandas,dataframe,Sorting,Python 2.7,Pandas,Dataframe,因此,我有一个熊猫数据框架,df,其中的列表示分类分类(即王国、门、类等)。我还有一个分类标签列表,对应于我希望数据框架的排序顺序 列表如下所示: class_list=['Gammaproteobacteria', 'Bacteroidetes', 'Negativicutes', 'Clostridia', 'Bacilli', 'Actinobacteria', 'Betaproteobacteria', 'delta/epsilon subdivisions', 'Synergistia
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']
当前的顺序不同。最好的方法是什么?您可以将类
列作为索引列
df = df.set_index('Class')
然后使用df.loc
使用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
如果原始数据帧不包含有序列表中的所有元素,Alex的解决方案将无法工作,即:如果某个时间点的输入数据不包含“NegativeCutes”,则此脚本将失败。解决这个问题的一种方法是将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)
为了获得更好的通用性,请使用
df=df.reindex(一些列表)
,有关重新索引步骤,请参阅。虽然DataFrame.loc[]
主要是基于标签的,但它也可以与布尔数组一起使用,如详细说明所示。因此,如果索引最终是布尔的,并且您尝试使用df=df.loc[[True,False]]
重新编制索引,那么您将抛出第二行。看见