按模式拆分列很容易:
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
答案 0 :(得分:5)
这是使用df.stack
和unstack
的一种方法,并使用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
答案 1 :(得分: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