将数据帧拆分为多个数据集

时间:2020-12-30 03:11:16

标签: python dataframe

我有一个数据框,它有索引列和 ds_value 列,就像下面打印的 df

index   ds_value <br>
1       SEG1|CA|90025|34|~SEG2|2|3|10150|~TITLE|Test| <br>
2       SEG1|NV|90567|50|~SEG24|4|5|54678|~JOB|None|<br>

如何找到每一行上的每个段类型,并根据为每个段分隔的管道分割数据行的段类型。段可以是相同的名称,也可以是不同的名称,每个段由 ~ 字符分隔 在这种情况下,我在第一行有 SEG1、SEG2 和 TITLE
和第二行的 SEG1、SEG24 和 JOB。

每个 Segment 可以在每个数据帧中,例如 Df1、df2、df3...等,因为我会将这些数据帧插入到 sql server

请帮助我

这是我期待的

df1: SEG1 <br>
index   0   1   2   3      <br>
1   SEG1    CA  90025   34 <br>
2   SEG1    NV  90567   50 <br>

df2 : SEG2<br>
index   0   1   2   3   <br>
1   SEG2    2   3   10150<br>


df3 :  TITLE<br>
index           0          1    <br>
1               TITLE       Test    <br>

df4 :  SEG24<br>
index     0     1     2   3 <br>
2      SEG24    4   5   54678 <br>

df5 : JOB<br>
index     0     1  <br>
2      JOB     None 

1 个答案:

答案 0 :(得分:0)

您可以先按 ~ 分割,然后按 | 分割,因此分割值的数量无关紧要,只要分隔符值以 ~ 开头(不是如果第一个不以 ~ 开头,则会出现问题:

s = df.ds_value.apply(lambda x: [x.strip('|') for x in x.split('~')])
dfs = [s.str[i].str.split('|', expand=True) for i in range(len(s[0]))]

# Set the original index for each dataframe
for d in dfs:
    d.index = df.index

dfs 的输出(数据框列表):

[
           0   1      2   3
 index                     
 1      SEG1  CA  90025  34
 2      SEG1  NV  90567  50,

           0  1  2      3
 index                   
 1      SEG2  2  3  10150
 2      SEG2  4  5  54678,

            0     1
 index             
 1      TITLE  Test
 2      TITLE  None
]

说明:

在此代码的第一行中,您将获得一系列由 ~ 分割的元素(还使用 strip 删除了不必要的末端管道):

0    [SEG1|CA|90025|34, SEG2|2|3|10150, TITLE|Test]
1    [SEG1|NV|90567|50, SEG2|4|5|54678, TITLE|None]
Name: ds_value, dtype: object

在第二行中,我们循环遍历将创建新数据帧的每个组,并通过拆分管道将值扩展为多列。在这一步中,我已经考虑到模式在值之间(相同数量的项目)是一致的,否则可能会失败。

最后,我们放回了列表中所有数据帧的原始索引。