我觉得我在这里根本上缺少什么。我有一个这样的Pandas DataFrame:
df = pd.DataFrame(list(range(3)).T
df.columns = ['a.first', 'a.second', 'b']
# a.first a.second b
# 0 0 1 2
我想创建一个MultiIndex DataFrame,可以在其中使用df.a,df.a.first和df.b。到目前为止,我得到的是str split方法:
a.columns = a.columns.str.split('.', expand=True)
# a b
# first second NaN
# 0 0 1 2
因此,NaN在这里显然是一个问题,因为要访问值b,需要调用df.b[np.nan]
,这显然是错误的。
从这里开始,我想到的所有解决方案开始都像一种变通方法,在该方法中,我遍历各列并尝试用空字符串替换NaN。我想必须有一种更直接的方法,因为我猜这是一个很普遍的问题,不是吗?
编辑:到目前为止,我想到的最丑陋的解决方案是:
def apply_multiindex(df, hier_sep='.'):
depths = df.columns.str.split(hier_sep).map(len)
add_hiers = max(depths)-depths
df.columns = [column + hier_sep*add_hier[c]
for c, column in enumerate(df.columns)]
df.columns = df.columns.str.split(hier_sep, expand=True)
apply_multiindex(a)
# a b
# first second
# 0 0 1 2
我仍然期待着更清洁的解决方案:)
对我来说rename
,缺少价值是因为未实现fillna
for MultiIndex
:
df = pd.DataFrame([list(range(3))], columns = ['a.first', 'a.second', 'b'])
df.columns = df.columns.str.split('.', expand=True)
df = df.rename(columns = {np.nan:''})
print (df)
a b
first second
0 0 1 2
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句