Python 将字符串拆分为两个单独的列

Python 将字符串拆分为两个单独的列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含大量数据和一列的数据框架,其结构如下: 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

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

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
我试图将该列中的数据结构如下所示:

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的COL,并在“=”上进行另一次拆分,但之后我只会有大量无组织的标签COL和值COL。

使用列表理解和字典对每个值进行解释,并传递给数据帧构造函数:

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
或者与expand=True一起使用,用于DataFrame、重塑依据、再次拆分、删除第一级多索引并添加新的level by 0列、最后一级重塑依据:

这里有一种方法使用:


您可以应用extractall和pivot。 在你得到所有东西之后:

             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
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