为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas:使用混合数据类型对多索引数据框的多级列进行排序

Pandas:使用混合数据类型对多索引数据框的多级列进行排序

SMILET 2024-01-16 15:33:17
下面是我的数据框: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]: dfOut[2807]:    A                                             D   E                                             E0  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我需要根据来自 的键(D,E)按降序对带有索引的多级列进行排序。valuedict正如您所看到的,valuekey 可以具有混合数据类型的值,例如int, string或 为空,例如{}, 或NaN。N/A并且Nan值应该始终在排序后出现在最后(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]: df1Out[2811]:    A                                             D   E                                             E0  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
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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


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


查看完整回答
反对 回复 2024-01-16
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信