python - 仅对 pandas DataFrame 的一部分进行重新排序

标签 python pandas sorting dataframe

上下文

我有一个 pandas-DataFrame,其结构类似于左侧的表格:

      + Category + Content + Layer                + Category + Content + Layer
Index |          |         |                Index |          |         |      
----------------------------------          ----------------------------------  
000001|   "A"    | "Dummy" |  0         ->  000001|   "A"    | "Dummy" |  0   
----------------------------------          ----------------------------------
000002|   "A"    | "Dummy" |  1         ->  000003|   "A"    | "Dummy" |  0   
----------------------------------          ----------------------------------
000003|   "A"    | "Dummy" |  0         ->  000002|   "A"    | "Dummy" |  1   
----------------------------------          ----------------------------------
000004|   "A"    | "Dummy" |  1         ->  000004|   "A"    | "Dummy" |  1    
----------------------------------          ----------------------------------
000005|   "B"    | "Dummy" |  2         =   000005|   "B"    | "Dummy" |  2   
----------------------------------          ----------------------------------
000006|   "B"    | "Dummy" |  0         =   000006|   "B"    | "Dummy" |  0   
----------------------------------          ----------------------------------
000007|   "B"    | "Dummy" |  4         =   000007|   "B"    | "Dummy" |  4   
----------------------------------          ----------------------------------

我想要实现的是对数据框进行重新排序,如右侧所示。

问题

如右表所示,只有数据帧的一部分应该重新排序 - 只有 category == "A" 的元素应按其层的升序方式排序category == "B" 的所有元素都必须保持原样(这是我当前使用 dataframe.sort_values() 等时遇到的问题)。

如何仅对数据帧的指定部分进行重新排序(排序)而不影响其余部分?

最佳答案

您可以分两步完成此操作:

  1. 按条件过滤行,例如通过创建 bool 掩码
  2. 通过.loc直接寻址底层numpy数组(以防止索引值对齐)

.loc: Access a group of rows and columns by label(s) or a boolean array. (Link to pandas-Documentation)

    #Boolean mask of the entire dataframe in order to identify relevant rows
    mask = df['Category'].eq('A')     #Anlog to mask = (df["Category"] == 'A')

    #pandas >= 0.24
    df.loc[mask] = df.loc[mask].sort_values('Layer').to_numpy()

    #pandas < 0.24
    df.loc[mask] = df.loc[mmask.sort_values('Layer').values

    #Result
    print (df)
           Category Content  Layer
    Index                         
    000001        A   Dummy      0
    000002        A   Dummy      0
    000003        A   Dummy      1
    000004        A   Dummy      1
    000005        B   Dummy      2
    000006        B   Dummy      0
    000007        B   Dummy      4

关于python - 仅对 pandas DataFrame 的一部分进行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56359069/

相关文章:

python - 如何对 AWS Sagemaker 托管的自定义 Tensorflow 模型使用多个输入

python - Pandas 根据条件过滤行,但始终保留第一行

c++ - 按特定值对结构成员进行排序

ruby-on-rails - 订购与第二个模型相关的第一个模型

c - 冒泡排序二维数组

python - ES density_vector字段:必须指定 'dims'

python - 如何使Django sqlclear输出依赖关系的CASCADE

python - 如何让 Windows 记住使用 tkinter filedialog 使用的最后一个目录?

python - Python远程查询sas7bdat文件的方法

python - NumPy 的 loadtxt : ValueError: Wrong number of columns