上下文
我有一个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"
的元素以其layer
的升序进行排序。
category == "B"
的所有元素都必须保持原样(这是我目前在使用dataframe.sort_values()
等时遇到的问题。)
如何在不影响其余部分的情况下仅对数据框的指定部分重新排序(重新排序)?
答案 0 :(得分:4)
您可以分两个步骤进行操作:
mask
.loc
直接寻址底层numpy数组(以防止索引值对齐)
.loc
:按标签或布尔数组访问一组行和列。 (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