考虑以下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
外层的列进行排序,该最内层的列适用于每组外部列,B
并C
基于多级列,索引(E, a)
基于value
dict的键以降序排列。
编辑:
在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] 删除。
我来说两句