如何将列拆分为2?

时间:2017-08-15 19:20:49

标签: pandas

我有以下df:

                    0
0    Fuerte venta (0,00)*
1   Infraponderar (0,00)*
2        Neutral (14,00)*
3   Sobreponderar (2,00)*
4  Fuerte compra (11,00)*

如何将列拆分为2列以获得以下输出:

           0         1
0    Fuerte venta (0,00)*
1   Infraponderar (0,00)*
2        Neutral (14,00)*
3   Sobreponderar (2,00)*
4  Fuerte compra (11,00)*

3 个答案:

答案 0 :(得分:4)

.str.rsplitexpand=True

一起使用
df['0'].str.rsplit(' ', n=1, expand=True)

输出:

               0         1
0   Fuerte venta   (0,00)*
1  Infraponderar   (0,00)*
2        Neutral  (14,00)*
3  Sobreponderar   (2,00)*
4  Fuerte compra  (11,00)*

答案 1 :(得分:3)

您可以使用str.rsplit

pd.DataFrame(df['0'].str.rsplit(' ', 1).tolist())

你得到了

    0               1
0   Fuerte venta    (0,00)*
1   Infraponderar   (0,00)*
2   Neutral         (14,00)*
3   Sobreponderar   (2,00)*
4   Fuerte compra   (11,00)*

答案 2 :(得分:2)

选项1
列表理解和str.rsplit
pir2

pd.DataFrame(
    pd.DataFrame([x.rsplit(' ', 1) for x in df['0'].values.tolist()])
)

               0         1
0   Fuerte venta   (0,00)*
1  Infraponderar   (0,00)*
2        Neutral  (14,00)*
3  Sobreponderar   (2,00)*
4  Fuerte compra  (11,00)*

选项2
使用np.core.defchararray.rsplit pir1

pd.DataFrame(
    np.core.defchararray.rsplit(df['0'].values.astype(str), ' ', 1).tolist()
)

               0         1
0   Fuerte venta   (0,00)*
1  Infraponderar   (0,00)*
2        Neutral  (14,00)*
3  Sobreponderar   (2,00)*
4  Fuerte compra  (11,00)*

<强>时序
以下代码
对于大型和小型数据集,list理解最快。

enter image description here

pir1 = lambda d: pd.DataFrame(np.core.defchararray.rsplit(d['0'].values.astype(str), ' ', 1).tolist())
pir2 = lambda d: pd.DataFrame([x.rsplit(' ', 1) for x in d['0'].values.tolist()])
bos = lambda d: d['0'].str.rsplit(' ', n=1, expand=True)
vai = lambda d: pd.DataFrame(d['0'].str.rsplit(' ', 1).tolist())

results = pd.DataFrame(
    index=pd.Index([10, 30, 100, 300, 1000, 3000]),
    columns='pir1 pir2 bos vai'.split()
)

for i in results.index:
    d = pd.concat([df] * i, ignore_index=True)
    for j in results.columns:
        stmt = '{}(d)'.format(j)
        setp = 'from __main__ import d, {}'.format(j)
        results.set_value(i, j, timeit(stmt, setp, number=100))

results.plot(loglog=True)