我有一个pandas数据框,如下所示:
id pos value sent
1 a/b/c test/test2/test3 21
2 d/a test/test5 21
我想拆分(=爆炸)df['pos']
和df['token']
,以便数据框看起来像这样:
id pos value sent
1 a test 21
1 b test2 21
1 c test3 21
2 d test 21
2 a test5 21
如果我拆分每一列然后将它们连接起来
,它就不起作用 pos = df.token.str.split('/', expand=True).stack().str.strip().reset_index(level=1, drop=True)
df1 = pd.concat([pos,value], axis=1, keys=['pos','value'])
有什么想法吗?我真的很感激。
编辑:
我尝试在此处使用此解决方案:https://stackoverflow.com/a/40449726/4219498
但是我收到以下错误:
TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'
我认为这是一个与numpy相关的问题,虽然我不确定这是怎么回事。我正在使用Python 2.7.14
答案 0 :(得分:2)
我倾向于避免stack
魔术支持从头开始构建新的数据帧。这通常也更有效。以下是一种方式。
import numpy as np
from itertools import chain
lens = list(map(len, df['pos'].str.split('/')))
res = pd.DataFrame({'id': np.repeat(df['id'], lens),
'pos': list(chain.from_iterable(df['pos'].str.split('/'))),
'value': list(chain.from_iterable(df['value'].str.split('/'))),
'sent': np.repeat(df['sent'], lens)})
print(res)
id pos sent value
0 1 a 21 test
0 1 b 21 test2
0 1 c 21 test3
1 2 d 21 test
1 2 a 21 test5