上下文
我有一个 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()
等时遇到的问题)。
如何仅对数据帧的指定部分进行重新排序(排序)而不影响其余部分?
最佳答案
您可以分两步完成此操作:
- 按条件过滤行,例如通过创建 bool
掩码
- 通过
.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/