Python - 在 Pandas DataFrame 中展开单元格

8
假设我有一个名为 dfDataFrame:
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

我知道如何在R中使用tidyr包来进行这种转换。

在pandas中有没有简单的方法来做到这一点?

2个回答

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

我认为np代表numpy。好的,但是它不起作用。看起来我的数据框无法将“”替换为na。 - Guilherme Jardim Duarte
жІЎй”ҷпјҢnpжҳҜжҢҮnumpyгҖӮеңЁ+ ' 'е’Ң.replace(' ', np.nan)дёӨдёӘйғЁеҲҶйғҪжңүз©әж јгҖӮ - Stefan

1

Option 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

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