Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按列表顺序对数据帧进行排序_Sorting_Python 2.7_Pandas_Dataframe - Fatal编程技术网

Sorting 按列表顺序对数据帧进行排序

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

因此,我有一个熊猫数据框架,df,其中的列表示分类分类(即王国、门、类等)。我还有一个分类标签列表,对应于我希望数据框架的排序顺序

列表如下所示:

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]]
重新编制索引,那么您将抛出第二行。看见