在熊猫中将字符串拆分为单独的列

时间:2019-12-16 15:08:56

标签: python pandas dataframe

我有一个包含大量数据和1列的数据框,其结构如下:

index    var_1
1        a=3:b=4:c=5:d=6:e=3
2        b=3:a=4:c=5:d=6:e=3
3        e=3:a=4:c=5:d=6
4        c=3:a=4:b=5:d=6:f=3

我正在尝试将该列中的数据结构如下:

index    a   b   c   d   e   f
1        3   4   5   6   3   0
2        4   3   5   6   3   0
3        4   0   5   6   3   0
4        4   5   3   6   0   3

到目前为止,我已经完成了以下操作:

df1 = df['var1'].str.split(':', expand=True)

然后我可以遍历df1的cols并在'='上进行另一次拆分,但是然后我将只有大量混乱的标签cols和value cols。

3 个答案:

答案 0 :(得分:3)

对每个值使用列表理解和字典,并传递给DataFrame构造函数:

comp = [dict([y.split('=') for y in x.split(':')]) for x in df['var_1']]
df = pd.DataFrame(comp).fillna(0).astype(int)
print (df)
   a  b  c  d  e  f
0  3  4  5  6  3  0
1  4  3  5  6  3  0
2  4  0  5  6  3  0
3  4  5  3  6  0  3

或将Series.str.splitexpand=True一起用于DataFrame,通过DataFrame.stack进行整形,再次拆分,删除MultiIndex的第一级,并通过{{ 1}}列,最后通过Series.unstack重塑:

0

答案 1 :(得分:1)

这是使用str.get_dummies的一种方法:

out = df.var_1.str.get_dummies(sep=':')
out = out * out.columns.str[2:].astype(int).values
out.columns = pd.MultiIndex.from_arrays([out.columns.str[0], out.columns])

print(out.max(axis=1, level=0))

       a  b  c  d  e  f
index                  
1      3  4  5  6  3  0
2      4  3  5  6  3  0
3      4  0  5  6  3  0
4      4  5  3  6  0  3

答案 2 :(得分:0)

您可以应用“ extractall”和“ pivot”。
在“ extractall”之后,您将得到:

             0  1
index match      
1     0      a  3
      1      b  4
      2      c  5
      3      d  6
      4      e  3
2     0      b  3
      1      a  4
      2      c  5
      3      d  6
      4      e  3
3     0      e  3
      1      a  4
      2      c  5
      3      d  6
4     0      c  3
      1      a  4
      2      b  5
      3      d  6
      4      f  3

一步之遥:

rslt= df.var_1.str.extractall(r"([a-z])=(\d+)") \
                .reset_index(level="match",drop=True) \
                .pivot(columns=0).fillna(0)                     


         1               
    0      a  b  c  d  e  f
    index                  
    1      3  4  5  6  3  0
    2      4  3  5  6  3  0
    3      4  0  5  6  3  0
    4      4  5  3  6  0  3

#rslt.columns= rslt.columns.levels[1].values