gpt4 book ai didi

python - Pandas - 按列对多级数据进行排序,但保留级别组顺序

转载 作者:行者123 更新时间:2023-12-01 08:28:03 25 4
gpt4 key购买 nike

我有一个多级数据框,其中有一列名为name。我想维护数据的父子级别分组,但按此 name 列对每个级别 A-Z 进行排序。

换句话说,对于每一行,如果父项已排序,则所有较低级别的子项也将作为一个 block 排序。

这是我当前数据框的示例:

df = pd.DataFrame(columns=['level', 'name'],                        
data=[['1','AAA'],
['1.1', 'ZZZ'],
['1.2', 'XXX'],
['1.3', 'YYY'],
['1.3.1', 'GGG'],
['1.3.1.1', 'XXX'],
['1.3.2', 'EEE'],
['1.3.3', 'FFF'],
['1.3.3.1', 'TTT'],
['1.3.3.2', 'SSS'],
['2', 'CCC'],
['3', 'BBB'],
['3.1', 'AAA']])

排序后的数据框应该是什么样子:

sorted_df = pd.DataFrame(columns=['level', 'name'],                 
data=[['1','AAA'], # No Change
['1.1', 'XXX'], # Was 1.2
['1.2', 'YYY'], # Was 1.3
['1.2.1', 'EEE'], # Was 1.3.2
['1.2.2', 'FFF'], # Was 1.3.3
['1.2.3', 'GGG'], # Was 1.3.1
['1.2.3.1', 'XXX'], # Was 1.3.1.1
['1.2.3.1', 'SSS'], # Was 1.3.3.2
['1.2.3.2', 'TTT'], # was 1.3.3.1
['1.3', 'ZZZ'], # Was 1.1
['2', 'BBB'], # Was 3
['2.1', 'AAA'], # Was 3.1
['3', 'CCC']]) # Was 2

将其分解为步骤:

  1. 按名称对最深级别(即 X.X.X.X)进行排序。在上面的原始 DF 中,1.3.3.1 (SSS) 和 1.3.3.2 (TTT) 将交换。 1.3.1.1 (XXX) 保持不变,因为 1.3.1.X 组中没有其他项目。

  2. 查看下一个级别(即 X.X.X - GGG、EEE、FFF)。 1.3.1 (GGG) 及其所有子级(即 1.3.1.1)需要移动到 EEE 和 FFF(及其子级)下方。 EEE 和 FFF(及其子项)已经处于正确的位置。

  3. 在下一个级别重复此过程,对 parent 及其所有 child 进行排序。

我尝试通过按点分割级别列来将数据框分解为多个索引:

df = pd.concat([df['level'].str.split('.', expand=True), df], axis=1) \
.set_index([0,1,2,3])

一旦到达这一点,我就陷入了困境。我尝试过各种方法(sort_valuesort_indexreset_index等),但无法解决(双关语) )。更复杂的是,'level' 可以是我的真实数据的任意长度(例如 1.2.2.1.2.3.1...),并且名称列也是任意的(参见 AAA 如何在示例数据中以不同级别重复)。

这似乎是一件简单的事情,但我花了几个小时进行研究,并且正在绞尽脑汁试图弄清楚。任何帮助将不胜感激!!

最佳答案

尝试使用fillna:

df.join(df.level.str.split('.', expand=True).fillna(-1))\
.sort_values([0,1,2,3])[['level','name']]

输出:

      level name
0 1 AAA
1 1.1 ZZZ
2 1.2 XXX
3 1.3 YYY
4 1.3.1 GGG
5 1.3.1.1 XXX
6 1.3.2 EEE
7 1.3.3 FFF
8 1.3.3.1 TTT
9 1.3.3.2 SSS
10 2 CCC
11 3 BBB
12 3.1 AAA

未知深度:

df.join(df.level.str.split('.', expand=True)).fillna(-1)\
.pipe(lambda x: x.sort_values(x.filter(regex='\d+').columns.tolist()))[['level','name']]

关于python - Pandas - 按列对多级数据进行排序,但保留级别组顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54095757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com