我有一个熊猫数据框,格式如下:
step value0 value1_avg ... value1_label1 value2_label1 ... Id
0 0 1.551959 0.579051 ... 0.45 0.700000 ... 1
1 1 1.515447 0.580128 ... 0.00 1.000000 ... 1
2 2 1.481759 0.277778 ... 0.00 1.000000 ... 1
3 0 1.461281 0.277778 ... 0.00 1.000000 ... 2
4 1 1.442006 0.439286 ... 0.20 0.733333 ... 2
5 2 1.415662 0.505467 ... 0.10 0.766667 ... 2
6 0 1.394186 0.515361 ... 0.00 1.000000 ... 3
7 1 1.374112 0.605263 ... 0.00 1.000000 ... 3
8 2 1.350135 0.803030 ... 0.00 1.000000 ... 3
我需要这样重新格式化:
Value1 ... Value1 Value2 ...
step value0 avg ... label1 label1 ... Id
0 0 1.551959 0.579051 ... 0.45 0.700000 ... 1
1 1 1.515447 0.580128 ... 0.00 1.000000 ... 1
2 2 1.481759 0.277778 ... 0.00 1.000000 ... 1
3 0 1.461281 0.277778 ... 0.00 1.000000 ... 2
4 1 1.442006 0.439286 ... 0.20 0.733333 ... 2
5 2 1.415662 0.505467 ... 0.10 0.766667 ... 2
6 0 1.394186 0.515361 ... 0.00 1.000000 ... 3
7 1 1.374112 0.605263 ... 0.00 1.000000 ... 3
8 2 1.350135 0.803030 ... 0.00 1.000000 ... 3
不幸的是,我对熊猫多索引系统有点迷茫。有人可以向我提供一些建议以根据需要重新格式化数据框吗?
非常感谢。
答案 0 :(得分:2)
我认为最好在'sent'
到_
之间没有MultiIndex in index
的所有列中使用,所以如果使用str.split
会变得很好MultiIndex in columns
:
df = df.set_index([c for c in df.columns if '_' not in c])
df.columns = df.columns.str.split('_', expand=True)
print (df)
value1 value2
avg label1 label1
step value0 Id
0 1.551959 1 0.579051 0.45 0.700000
1 1.515447 1 0.580128 0.00 1.000000
2 1.481759 1 0.277778 0.00 1.000000
0 1.461281 2 0.277778 0.00 1.000000
1 1.442006 2 0.439286 0.20 0.733333
2 1.415662 2 0.505467 0.10 0.766667
0 1.394186 3 0.515361 0.00 1.000000
1 1.374112 3 0.605263 0.00 1.000000
2 1.350135 3 0.803030 0.00 1.000000
因为仅使用split
会得到非_
列名称的缺失值:
df.columns = df.columns.str.split('_', expand=True)
print (df)
step value0 value1 value2 Id
NaN NaN avg label1 label1 NaN
0 0 1.551959 0.579051 0.45 0.700000 1
1 1 1.515447 0.580128 0.00 1.000000 1
2 2 1.481759 0.277778 0.00 1.000000 1
3 0 1.461281 0.277778 0.00 1.000000 2
4 1 1.442006 0.439286 0.20 0.733333 2
5 2 1.415662 0.505467 0.10 0.766667 2
6 0 1.394186 0.515361 0.00 1.000000 3
7 1 1.374112 0.605263 0.00 1.000000 3
8 2 1.350135 0.803030 0.00 1.000000 3
但是可以将空字符串设置为level的第一个值,如果不是_
:
L = [x.split('_') if '_' in x else ['', x] for x in df.columns]
df.columns = pd.MultiIndex.from_tuples(L)
print (df)
value1 value2
step value0 avg label1 label1 Id
0 0 1.551959 0.579051 0.45 0.700000 1
1 1 1.515447 0.580128 0.00 1.000000 1
2 2 1.481759 0.277778 0.00 1.000000 1
3 0 1.461281 0.277778 0.00 1.000000 2
4 1 1.442006 0.439286 0.20 0.733333 2
5 2 1.415662 0.505467 0.10 0.766667 2
6 0 1.394186 0.515361 0.00 1.000000 3
7 1 1.374112 0.605263 0.00 1.000000 3
8 2 1.350135 0.803030 0.00 1.000000 3
但是然后使用空字符串也可以选择带有元组的列(但这只是技巧,最好是使用第一个解决方案):
print (df[('','step')])
0 0
1 1
2 2
3 0
4 1
5 2
6 0
7 1
8 2
Name: (, step), dtype: int64