DataFrame(13):DataFrame的排序与排名问题

Posted 数据分析与统计学之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataFrame(13):DataFrame的排序与排名问题相关的知识,希望对你有一定的参考价值。

1、说明

  DataFrame中的排序分为两种,一种是对索引排序,一种是对值进行排序。
  索引排序:sort_index();值排序:sort_values();值排名:rank()
  对于索引排序,涉及到对行索引、列索引的排序,并且还涉及到是升序还是降序。函数df.sort_index(axis= , ascending= , inplace=),需要特别注意这三个参数。axis表示对行操作,还是对列操作;ascending表示升序,还是降序操作。
  对于值排序,同样也是涉及到行、列排序问题,升序、降序排列问题。函数df.sort_values(by= , axis= , ascending= , inplace=),也需要特别注意这几个参数,只是多了一个by操作,需要我们指明是按照哪一行或哪一列,进行排序的。
  注意:axis=0表示对行操作,axis=1表示对列进行操作;ascending=True表示升序,ascending=False表示降序;inplace=True表示对原始DataFrame本身操作,因此不需要赋值操作,inplace=False相当于是对原始DataFrame的拷贝,之后的一些操作都是针对这个拷贝文件进行操作的,因此需要我们赋值给一个变量,保存操作后的结果。

2、索引排序:df.sort_index()

① 对行索引,进行升序排列
df = pd.DataFrame("A":[1,3,5,7,9],
                   "D":[1,2,3,4,5],
                   "C":[3,6,9,12,15],
                   "B":[2,4,6,8,10],
                   index=list("acbed"))
display(df)
display(id(df))

df.sort_index(axis=0,ascending=True,inplace=True)
display(df)
display(id(df))

df1 = df.sort_index(axis=0,ascending=True)
display(df1)
display(id(df1))

结果如下:

② 对列索引,进行降序排列
df = pd.DataFrame("A":[1,3,5,7,9],
                   "D":[1,2,3,4,5],
                   "C":[3,6,9,12,15],
                   "B":[2,4,6,8,10],
                   index=list("acbed"))
display(df)

df.sort_index(axis=1,ascending=False,inplace=True)
display(df)

结果如下:

3、值排序:df.sort_values()

① 对某一列进行升序排列(有实际意义)
df = pd.DataFrame("A":[3,1,5,9,7],
                   "D":[4,1,2,5,3],
                   "C":[3,15,9,6,12],
                   "B":[2,4,6,10,8],
                   index=list("acbed"))
display(df)

df.sort_values(by="A",axis=0,ascending=True,inplace=True)
display(df)

结果如下:

② 对某一行进行降序排列(实际意义不大)
df = pd.DataFrame("A":[3,1,5,9,7],
                   "D":[4,1,2,5,3],
                   "C":[3,15,9,6,12],
                   "B":[2,4,6,10,8],
                   index=list("acbed"))
display(df)

df.sort_values(by="A",axis=1,ascending=False,inplace=True)
display(df)

结果如下:

③ 对多列进行联合排序(重要)
df = pd.DataFrame("A":[3,1,3,9,7],
                   "D":[666,1,888,5,3],
                   "C":[3,15,9,6,12],
                   "B":[2,4,6,10,8],
                   index=list("acbed"))
display(df)

df.sort_values(by=["A","D"],axis=0,ascending=[True,False],inplace=True)
df

结果如下:

注意:上图中,我们分别按照A和D这个列进行排序,先按照A列做升序排列,当A列中具有相同值的时候,就按照D列做降序排列。

4、sort_values()中的na_position参数

  na_position参数用于设定缺失值的显示位置,first表示缺失值显示在最前面;last表示缺失值显示在最后面。

df = pd.DataFrame("A":[10,8,np.nan,2,4],
                   "D":[1,7,5,3,8],
                   "B":[5,2,8,4,1],
                   index=list("abcde"))
display(df)

df.sort_values(by="A",axis=0,inplace=True,na_position="first")
display(df)

df.sort_values(by="A",axis=0,inplace=True,na_position="last")
display(df)

结果如下:

5、“值排名”:rank()函数

1)rank()函数的常用参数说明

2)原始数据
x = "name":["张三","李四","王五","赵六","郑七","陈八","黄九","孙十"],
     "sales":[60,40,50,40,30,80,70,60]
df = pd.DataFrame(x)
display(df)

结果如下:

3)rank()函数使用如下
① method=“first”
x = "name":["张三","李四","王五","赵六","郑七","陈八","黄九","孙十"],
     "sales":[60,40,50,40,30,80,70,60]
df = pd.DataFrame(x)
display(df)

df["排名"] = df["sales"].rank(method="first")
display(df)

结果如下:

② method=“min”
x = "name":["张三","李四","王五","赵六","郑七","陈八","黄九","孙十"],
     "sales":[60,40,50,40,30,80,70,60]
df = pd.DataFrame(x)
display(df)

df["排名"] = df["sales"].rank(method="min")
display(df)

结果如下:

③ method=“max”
x = "name":["张三","李四","王五","赵六","郑七","陈八","黄九","孙十"],
     "sales":[60,40,50,40,30,80,70,60]
df = pd.DataFrame(x)
display(df)

df["排名"] = df["sales"].rank(method="max")
display(df)

结果如下:

④ method=“average”
x = "name":["张三","李四","王五","赵六","郑七","陈八","黄九","孙十"],
     "sales":[60,40,50,40,30,80,70,60]
df = pd.DataFrame(x)
display(df)

df["排名"] = df["sales"].rank(method="average")
display(df)

结果如下:

以上是关于DataFrame(13):DataFrame的排序与排名问题的主要内容,如果未能解决你的问题,请参考以下文章

Spark成长之路(13)-DataSet与DataFrame

在同一个图中绘制不同的 DataFrame

将多列数据移动到左侧Pandas Dataframe [重复]

有没有办法用第二个 Dataframe 中的一列填充一个 Dataframe 中的一列?

Pandas DataFrame:ValueError:值的长度(13)与索引的长度(12)不匹配

如何在DataFrame组中执行算术运算在Spark中进行聚合? [重复]