假设我有DataFrame
df
:
a b c
v f 3|4|5
v 2 6
v f 4|5
我想制作此df
:
a b c
v f 3
v f 4
v f 5
v 2 6
v f 4
v f 5
我知道如何使用tidyr
包在R中进行此转换。
在熊猫中有一种简单的方法吗?
答案 0 :(得分:2)
你可以:
import numpy as np
df = df.set_index(['a', 'b'])
df = df.astype(str) + '| ' # There's a space ' ' to match the replace later
df = df.c.str.split('|', expand=True).stack().reset_index(-1, drop=True).replace(' ', np.nan).dropna().reset_index() # and replace also has a space ' '
得到:
a b 0
0 v f 3
1 v f 4
2 v f 5
3 v 2 6
4 v f 4
5 v f 5
答案 1 :(得分:1)
选项1
In [3404]: (df.set_index(['a', 'b'])['c']
.str.split('|', expand=True).stack()
.reset_index(name='c').drop('level_2', 1))
Out[3404]:
a b c
0 v f 3
1 v f 4
2 v f 5
3 v 2 6
4 v f 4
5 v f 5
选项2 使用repeat
和loc
In [3503]: s = df.c.str.split('|')
In [3504]: df.loc[df.index.repeat(s.str.len())].assign(c=np.concatenate(s))
Out[3504]:
a b c
0 v f 3
0 v f 4
0 v f 5
1 v 2 6
2 v f 4
2 v f 5
详细
In [3505]: s
Out[3505]:
0 [3, 4, 5]
1 [6]
2 [4, 5]
Name: c, dtype: object