大熊猫:根据其他多层列,对最里面的列进行分组排序

Mayank porwal

考虑以下df:

In [3771]: df = pd.DataFrame({'A': ['a'] * 11,
               'B': ['b'] * 11,
               'C': ['C1', 'C1', 'C2','C1', 'C3', 'C3', 'C2', 'C3', 'C3', 'C2', 'C2'],
               'D': ['D1', 'D2', 'D1', 'D3', 'D3', 'D2', 'D4', 'D4', 'D1', 'D2', 'D3'],
               'E': [{'value': '4', 'percentage': None}, {'value': 5, 'percentage': None}, {'value': 12, 'percentage': None}, {'value': 5, 'percentage': None}, {'value': '12', 'percentage': None}, {'value': 'N/A', 'percentage': None}, {}, {'value': 19, 'percentage': None}, {'value': 12, 'percentage': None}, {'value': 11, 'percentage': None}, np.nan],
               'F':[{'value': 72, 'percentage': None}, {'value': 72, 'percentage': None}, {'value': 66, 'percentage': None}, {'value': 62, 'percentage': None}, {'value': 66, 'percentage': None}, {'value': 16,      'percentage': None}, {'value': 67, 'percentage': None}, {'value': 67, 'percentage': None}, {'value': 66, 'percentage': None}, {'value': 54, 'percentage': None}, {'value': 78, 'percentage': None}]})

In [3779]: df
Out[3898]: 
    A  B   C   D                                     E                                  F
0   a  b  C1  D1    {'value': '4', 'percentage': None}  {'value': 72, 'percentage': None}
1   a  b  C1  D2      {'value': 5, 'percentage': None}  {'value': 72, 'percentage': None}
2   a  b  C2  D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
3   a  b  C1  D3      {'value': 5, 'percentage': None}  {'value': 62, 'percentage': None}
4   a  b  C3  D3   {'value': '12', 'percentage': None}  {'value': 66, 'percentage': None}
5   a  b  C3  D2  {'value': 'N/A', 'percentage': None}  {'value': 16, 'percentage': None}
6   a  b  C2  D4                                    {}  {'value': 67, 'percentage': None}
7   a  b  C3  D4     {'value': 19, 'percentage': None}  {'value': 67, 'percentage': None}
8   a  b  C3  D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
9   a  b  C2  D2     {'value': 11, 'percentage': None}  {'value': 54, 'percentage': None}
10  a  b  C2  D3                                   NaN  {'value': 78, 'percentage': None}

pivot上面的df:

In [3776]: x = df.pivot(['B', 'C', 'D'], 'A', ['E', 'F'])

In [3781]: x
Out[3900]: 
                                            E                                  F
A                                           a                                  a
B C  D                                                                          
b C1 D1    {'value': '4', 'percentage': None}  {'value': 72, 'percentage': None}
     D2      {'value': 5, 'percentage': None}  {'value': 72, 'percentage': None}
     D3      {'value': 5, 'percentage': None}  {'value': 62, 'percentage': None}
  C2 D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
     D2     {'value': 11, 'percentage': None}  {'value': 54, 'percentage': None}
     D3                                   NaN  {'value': 78, 'percentage': None}
     D4                                    {}  {'value': 67, 'percentage': None}
  C3 D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
     D2  {'value': 'N/A', 'percentage': None}  {'value': 16, 'percentage': None}
     D3   {'value': '12', 'percentage': None}  {'value': 66, 'percentage': None}
     D4     {'value': 19, 'percentage': None}  {'value': 67, 'percentage': None}

我想对最D外层的列进行排序,该最内层的列适用于每组外部列,BC基于多级列,索引(E, a)基于valuedict的键以降序排列

编辑:

dict可以value与混合数据类型键。它可以是int,str,NaN或根本不可用。

预期产量:

                                            E                                  F
A                                           a                                  a
B C  D                                                                          
b C1 D2      {'value': 5, 'percentage': None}  {'value': 72, 'percentage': None}
     D3      {'value': 5, 'percentage': None}  {'value': 62, 'percentage': None}
     D1    {'value': '4', 'percentage': None}  {'value': 72, 'percentage': None}
  C2 D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
     D2     {'value': 11, 'percentage': None}  {'value': 54, 'percentage': None}
     D4                                    {}  {'value': 67, 'percentage': None}
     D3                                   NaN  {'value': 78, 'percentage': None}
  C3 D4     {'value': 19, 'percentage': None}  {'value': 67, 'percentage': None}
     D1     {'value': 12, 'percentage': None}  {'value': 66, 'percentage': None}
     D3   {'value': '12', 'percentage': None}  {'value': 66, 'percentage': None}
     D2  {'value': 'N/A', 'percentage': None}  {'value': 16, 'percentage': None}
 


 
耶斯列尔

使用MultiIndex column创建的辅助程序的解决方案Series.str.get,然后按排序DataFrame.sort_values,最后删除辅助程序列:

x[('new', 'a')] = pd.to_numeric(x[('E','a')].str.get('value'), errors='coerce')
lvl = x.index.names[:-1]

order = 'desc'

x = (x.sort_values(lvl + [('new', 'a')],ascending=[True] * len(lvl) + [order == 'asc'])
       .drop(('new', 'a'), axis=1))

print (x)

                                            E  \
A                                           a   
B C  D                                          
b C1 D2      {'value': 5, 'percentage': None}   
     D3      {'value': 5, 'percentage': None}   
     D1    {'value': '4', 'percentage': None}   
  C2 D1     {'value': 12, 'percentage': None}   
     D2     {'value': 11, 'percentage': None}   
     D3                                   NaN   
     D4                                    {}   
  C3 D4     {'value': 19, 'percentage': None}   
     D1     {'value': 12, 'percentage': None}   
     D3   {'value': '12', 'percentage': None}   
     D2  {'value': 'N/A', 'percentage': None}   

                                         F  
A                                        a  
B C  D                                      
b C1 D2  {'value': 72, 'percentage': None}  
     D3  {'value': 62, 'percentage': None}  
     D1  {'value': 72, 'percentage': None}  
  C2 D1  {'value': 66, 'percentage': None}  
     D2  {'value': 54, 'percentage': None}  
     D3  {'value': 78, 'percentage': None}  
     D4  {'value': 67, 'percentage': None}  
  C3 D4  {'value': 67, 'percentage': None}  
     D1  {'value': 66, 'percentage': None}  
     D3  {'value': 66, 'percentage': None}  
     D2  {'value': 16, 'percentage': None}  

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

熊猫:根据除一排以外的其他多列,按组对最里面的列进行排序

用两列在大熊猫分组中排序

大熊猫根据按列分组的指标计算差异

从大熊猫其他列的聚集创建新列

大熊猫:根据其他数据框创建数据框列

大熊猫基于其他列分配值

Pandas:根据多级列(不包括与特定子字符串匹配的一行)对最里面的列进行分组排序

大熊猫:按两列分组,然后按第三列的值对其进行排序

大熊猫将总和拆分为上限,然后在其他列中继续进行剩余操作

使用大熊猫按列分组,然后根据条件创建新列

大熊猫列总数,不包括基于其他列值的某些行

大熊猫从其他2列中删除列值

大熊猫:使用其他两列中的任何一个添加新列

大熊猫-如何聚合两列并保留所有其他列

大熊猫中的列以其他列的平均值为条件

根据列(字符串)对大熊猫中的CSV排序

如何在没有聚合功能的大熊猫中对列进行分组?

基于列内部索引对大熊猫数据框进行分组

通过对列进行分组来合并大熊猫数据框的行

大熊猫:基于多个列对数据框进行排序

大熊猫增量次数列基于其他列的值

大熊猫将嵌套值与其他列一起切片

大熊猫-根据索引结果返回大熊猫中的相邻列

根据count列对大熊猫数据帧进行下采样

大熊猫遍历行和列,并根据某些条件进行打印

分组删除存在重复行的列。大熊猫

大熊猫将分组的行转换为列

如何按两列条件大熊猫分组数据

根据Python Pandas中的其他列对列进行分组