Pandas字符串拆分和应用,创建多级索引数据框

3

通过模式分割列很容易:

import pandas as pd

_df = pd.DataFrame([['1 / 2 / 3', '4 / 5 / 6'], ['7 / 8 / 9', '10 / 11 / 12']])
_df.apply(lambda x: x.str.split(' / '))

           0             1
0  [1, 2, 3]     [4, 5, 6]
1  [7, 8, 9]  [10, 11, 12]

但是,我该如何使用expand=True创建一个多级索引的数据框架?我不知道在哪里传递索引参数。

_df.apply(lambda x: x.str.split(' / ', expand=True))
ValueError: If using all scalar values, you must pass an index

期望输出(列名称不重要,可以是任意的):

           A         B
    a  b  c    a  b  c
0   1  2  3    4  5  6
1   7  8  9   10 11 12

1
你能分享一下期望的输出结果吗? - yatu
添加了预期的形状。 - Moritz
2个回答

5
这里有一种方法,使用 df.stackunstack, 结合使用一点 swaplevel 的帮助:
s=_df.stack().str.split(' / ')
out = (pd.DataFrame(s.tolist(),index=s.index).unstack()
      .swaplevel(axis=1).sort_index(axis=1))

   0         1        
   0  1  2   0   1   2
0  1  2  3   4   5   6
1  7  8  9  10  11  12

为了匹配特定的输出,我们可以使用:
from string import ascii_lowercase
out.rename(columns=dict(enumerate(ascii_lowercase)))

   a         b        
   a  b  c   a   b   c
0  1  2  3   4   5   6
1  7  8  9  10  11  12

或者更好的方式是 :)
from string import ascii_lowercase, ascii_uppercase
out.rename(columns=dict(enumerate(ascii_uppercase)), level=0, inplace=True)
out.rename(columns=dict(enumerate(ascii_lowercase)), level=1, inplace=True)


print(out)

   A         B        
   a  b  c   a   b   c
0  1  2  3   4   5   6
1  7  8  9  10  11  12

2

IIUC pd.concat

s=pd.concat([pd.DataFrame(df[x].str.split(' / ').tolist()) for x in df.columns], axis=1, keys=['a','b'])
   a         b        
   0  1  2   0   1   2
0  1  2  3   4   5   6
1  7  8  9  10  11  12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接