我认为在数据帧切片上创建multiIndex的方式存在概念性错误。请考虑以下代码:
import cufflinks as cf
df=cf.datagen.lines(6,mode='abc')
df.columns = MultiIndex.from_tuples([('Iter1','a'), ('Iter1','b'),
('Iter2','c'), ('Iter2','d'),
('Iter3','e'), ('Iter3','f')])
df.head()
创建一个简单的multiIndexed柱状数据框:
切片此数据框:
new_df = df[['Iter1','Iter2']].copy()
new_df.head()
所以似乎数据显示正常,但在幕后,完整的索引仍然存在:
In [52]: new_df.columns
Out[52]:
MultiIndex(levels=[[u'Iter1', u'Iter2', u'Iter3'], [u'a', u'b', u'c', u'd', u'e', u'f']],
labels=[[0, 0, 1, 1], [0, 1, 2, 3]])
这对我来说似乎是一个错误,因为现在尝试接近切片数据框中的最后一列时不会返回任何内容:
In [54]:
last_col = new_df.columns.levels[0][-1]
new_df[last_col].head()
Out[54]:
2015-01-01
2015-01-02
2015-01-03
2015-01-04
2015-01-05
我想通过切片我的原始数据框将几个多列传递给我的函数,但似乎我没办法以编程方式处理这些列。
答案 0 :(得分:3)
您需要remove_unused_levels
pandas 0.20.0
中的新功能,还可以查看docs:
new_df.columns.remove_unused_levels()
样品:
np.random.seed(23)
cols = pd.MultiIndex.from_tuples([('Iter1','a'), ('Iter1','b'),
('Iter2','c'), ('Iter2','d'),
('Iter3','e'), ('Iter3','f')])
idx = pd.date_range('2015-01-01', periods=5)
df = pd.DataFrame(np.random.rand(5,6), columns=cols, index=idx)
print (df)
Iter1 Iter2 Iter3
a b c d e f
2015-01-01 0.517298 0.946963 0.765460 0.282396 0.221045 0.686222
2015-01-02 0.167139 0.392442 0.618052 0.411930 0.002465 0.884032
2015-01-03 0.884948 0.300410 0.589582 0.978427 0.845094 0.065075
2015-01-04 0.294744 0.287934 0.822466 0.626183 0.110478 0.000529
2015-01-05 0.942166 0.141501 0.421597 0.346489 0.869785 0.428602
new_df = df[['Iter1','Iter2']].copy()
print (new_df)
Iter1 Iter2
a b c d
2015-01-01 0.517298 0.946963 0.765460 0.282396
2015-01-02 0.167139 0.392442 0.618052 0.411930
2015-01-03 0.884948 0.300410 0.589582 0.978427
2015-01-04 0.294744 0.287934 0.822466 0.626183
2015-01-05 0.942166 0.141501 0.421597 0.346489
print (new_df.columns)
MultiIndex(levels=[['Iter1', 'Iter2', 'Iter3'], ['a', 'b', 'c', 'd', 'e', 'f']],
labels=[[0, 0, 1, 1], [0, 1, 2, 3]])
print (new_df.columns.remove_unused_levels())
MultiIndex(levels=[['Iter1', 'Iter2'], ['a', 'b', 'c', 'd']],
labels=[[0, 0, 1, 1], [0, 1, 2, 3]])
new_df.columns = new_df.columns.remove_unused_levels()
print (new_df.columns)
MultiIndex(levels=[['Iter1', 'Iter2'], ['a', 'b', 'c', 'd']],
labels=[[0, 0, 1, 1], [0, 1, 2, 3]])