【问题标题】:Pandas: Sort a Multiindex Dataframe's multi-level column with mixed datatypesPandas:对具有混合数据类型的 Multiindex Dataframe 多级列进行排序
【发布时间】:2021-02-10 17:44:18
【问题描述】:

下面是我的数据框:

In [2804]: df = pd.DataFrame({'A':[1,2,3,4,5,6], 'D':[{"value": '126', "perc": None, "unit": None}, {"value": 324, "perc": None, "unit": None}, {"value": 'N/A', "perc": None, "unit": None}, {}, {"value": '100', "perc": None, "unit": None}, np.nan]})

In [2794]: df.columns = pd.MultiIndex.from_product([df.columns, ['E']])

In [2807]: df
Out[2807]: 
   A                                             D
   E                                             E
0  1  {'value': '126', 'perc': None, 'unit': None}
1  2    {'value': 324, 'perc': None, 'unit': None}
2  3  {'value': 'N/A', 'perc': None, 'unit': None}
3  4                                            {}
4  5  {'value': '100', 'perc': None, 'unit': None}
5  6                                           NaN

我需要根据dict 中的value 键对索引为(D,E) 的多级列进行降序排序。

如您所见,value 键可以具有混合数据类型的值,例如 int, string 或空的值,例如 {}NaN

N/ANan 值应始终在排序后出现(包括 asc 和 desc)。

预期输出:

In [2814]: df1 = pd.DataFrame({'A':[2,1,5,3,4,6], 'D':[{"value": 324, "perc": None, "unit": None}, {"value": '126', "perc": None, "unit": None}, {"value": '100', "perc": None, "unit": None}, {"value": 'N/A', "perc": None, "unit": None}, {},np.nan]})

In [2799]: df1.columns = pd.MultiIndex.from_product([df1.columns, ['E']])

In [2811]: df1
Out[2811]: 
   A                                             D
   E                                             E
0  2    {'value': 324, 'perc': None, 'unit': None}
1  1  {'value': '126', 'perc': None, 'unit': None}
2  5  {'value': '100', 'perc': None, 'unit': None}
3  3  {'value': 'N/A', 'perc': None, 'unit': None}
4  4                                            {}
5  6                                           NaN

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    创建由数字填充并按此列排序的辅助列:

    df['tmp'] = pd.to_numeric(df[('D','E')].str.get('value'), errors='coerce')
    df1 = df.sort_values('tmp', ascending=False).drop('tmp', axis=1)
    print (df1)
       A                                             D
       E                                             E
    1  2    {'value': 324, 'perc': None, 'unit': None}
    0  1  {'value': '126', 'perc': None, 'unit': None}
    4  5  {'value': '100', 'perc': None, 'unit': None}
    2  3  {'value': 'N/A', 'perc': None, 'unit': None}
    3  4                                            {}
    5  6                                           NaN
    

    df1 = df.sort_values('tmp').drop('tmp', axis=1)
    print (df1)
       A                                             D
       E                                             E
    4  5  {'value': '100', 'perc': None, 'unit': None}
    0  1  {'value': '126', 'perc': None, 'unit': None}
    1  2    {'value': 324, 'perc': None, 'unit': None}
    2  3  {'value': 'N/A', 'perc': None, 'unit': None}
    3  4                                            {}
    5  6                                           NaN
        
    

    【讨论】:

      猜你喜欢
      • 2021-02-15
      • 2016-12-01
      • 2017-09-14
      • 2017-10-16
      • 2022-06-11
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多