我有一个数据框,它有索引列和 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
答案 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
在第二行中,我们循环遍历将创建新数据帧的每个组,并通过拆分管道将值扩展为多列。在这一步中,我已经考虑到模式在值之间(相同数量的项目)是一致的,否则可能会失败。
最后,我们放回了列表中所有数据帧的原始索引。