首页 > 解决方案 > 拆分数据框中的几列

问题描述

我有一个数据框,我想将第 3 列中的字符串拆分到最后一列,每列分为两列,并且标题保留在第一个拆分列中。这是数据框:

Sample  Pop     a1      a10     a100
F295    Pesche  AC      AT      AA
F296    Pesche  GT      CG      AC
F297    Pesche  AA      GG      TT
F298    Pesche  AC      AG      CG

这是我想要的数据框,从第 3 列拆分为带有字符串的两列(制表符分隔):

Sample  Pop     a1      a10     a100
F295    Pesche  A   C   A   T   A     A
F296    Pesche  G   T   C   G   A     C
F297    Pesche  A   A   G   G   T     T
F298    Pesche  A   C   A   G   C     G

这个问题与“拆分一列”的问题不相似,请帮忙。

标签: pythonpandas

解决方案


您可以通过将转换后的字符串拆分为带有for joinMultiIndex的列表的值来创建列:concat

df1 = df.set_index(['Sample','Pop'])
comp = [pd.DataFrame(df1[x].apply(list).values.tolist(), index=df1.index) for x in df1.columns]
df2 = pd.concat(comp, axis=1, keys=df1.columns)
print (df2)
              a1    a10    a100   
               0  1   0  1    0  1
Sample Pop                        
F295   Pesche  A  C   A  T    A  A
F296   Pesche  G  T   C  G    A  C
F297   Pesche  A  A   G  G    T  T
F298   Pesche  A  C   A  G    C  G

如果需要避免MultiIndex首先通过 f 字符串连接列名以避免重复的列名,然后DataFrame.reset_index

df2.columns = [f'{a}_{b}' for a, b in df2.columns]
df2 = df2.reset_index()
print (df2)
  Sample     Pop a1_0 a1_1 a10_0 a10_1 a100_0 a100_1
0   F295  Pesche    A    C     A     T      A      A
1   F296  Pesche    G    T     C     G      A      C
2   F297  Pesche    A    A     G     G      T      T
3   F298  Pesche    A    C     A     G      C      G

推荐阅读