使用文本作为列标题和熊猫中的列值将字符串拆分为列

时间:2019-08-29 16:47:13

标签: python pandas

我有一个具有1列的df,其中每一行都包含一个字符串。看起来像这样:

df
          data
in 9.14  out 9.66  type 0.0
in 9.67  out 9.69  type 0.0
in 9.70  out 10.66 type 0.0
in 10.67 out 11.34 type 2.0
in 11.35 out 12.11 type 2.0

我想将此列的文本分成多列。我想使用单词[in,out,type]作为列标题,并将每个单词后面的值用作行值。结果将有3列分别标记为in,out和type,如下所示:

        df
        
         in    out   type
        9.14   9.66   0.0
        9.67   9.69   0.0
        9.70   10.66  0.0
        10.67  11.34  2.0
        11.35  12.11  2.0

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您事先知道单词的含义,并且还可以保证不会有任何不良数据,那么这是一个简单的str.extract问题,您可以在其中构造一个健壮的正则表达式来捕获每个单词组,使用命名组一次创建DataFrame。方法2中包含该示例数据的正则表达式。

但是,为了演示起见,最好假设您可能有错误的数据,并且可能事先不知道列名是什么。在这种情况下,您可以使用str.extractall和一些unstack的版本。

选项1
extractall + set_index + unstack

generic_regex = r'([a-zA-Z]+)[^0-9]+([0-9\.]+)'

df['data'].str.extractall(generic_regex).set_index(0, append=True)[1].unstack([0, 1])

0         in    out type
match      0      1    2
0       9.14   9.66  0.0
1       9.67   9.69  0.0
2       9.70  10.66  0.0
3      10.67  11.34  2.0
4      11.35  12.11  2.0

选项2
定义一个明确的正则表达式并使用extract


rgx = r'in\s+(?P<in>[^\s]+)\s+out\s+(?P<out>[^\s]+)\s+type\s+(?P<type>[^\s]+)'

df['data'].str.extract(rgx)

      in    out type
0   9.14   9.66  0.0
1   9.67   9.69  0.0
2   9.70  10.66  0.0
3  10.67  11.34  2.0
4  11.35  12.11  2.0

答案 1 :(得分:0)

如果像样本中的数据一样,namevalue之间用空格均匀分隔,则可以使用splitstr访问器跨步来构造所需的输出

df1 = df['data'].str.split()
df_out = pd.DataFrame(df1.str[1::2].tolist(), columns=df1[0][0::2])

Out[1097]:
      in    out type
0   9.14   9.66  0.0
1   9.67   9.69  0.0
2   9.70  10.66  0.0
3  10.67  11.34  2.0
4  11.35  12.11  2.0