python - Pandas:使用混合数据类型对多索引数据框的多级列进行排序
问题描述
下面是我的数据框:
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
我需要根据key from(D,E)
以降序对具有索引的多级列进行排序。value
dict
如您所见value
,键可以具有混合数据类型中的值,例如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]: 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
解决方案
创建由数字填充的辅助列并按此列排序:
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
推荐阅读
- python - 在 python 中找到临界值,有限集的问题
- java - 在按钮上的片段中使用弹出菜单
- python - 使用 Tensorboard 加载嵌入投影仪时出错
- javascript - jQuery自动完成下拉菜单位置
- c# - 使用服务器和客户端证书的 WCF 加密/解密
- c# - TFS 发布 - 获取构建工件失败
- python - Snowflake 如何处理 NULL 值?
- android - AutoCompleteTextView 使用 MergeCursor 显示来自 SearchRecentSuggestionsProvider 的错误字符串
- javascript - 401:当我尝试在 .net 中通过 AJAX 调用方法时未授权
- react-native - 控制台日志在 React Native 中只显示一次