在datafram中拆分多个列

2024-10-04 11:31:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,我想把第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

这个问题和那些“一分为二”的问题不一样,请帮忙


Tags: 数据sample字符串a1popcga10ac
2条回答

您可以通过将转换的字符串拆分为列表来在列中创建MultiIndex,其中^{}用于连接:

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字符串连接列名,以避免重复的列名,然后^{}

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

你可以用for循环

import pandas as pd

data = {
    'Sample': ['F295','F296','F297','F298'],
    'Pop': ['Pesche', 'Pesche', 'Pesche', 'Pesche'],
    'a1': ['AC', 'GT', 'AA', 'AC'],
    'a10': ['AT', 'CG', 'GG', 'AG'],
    'a100': ['AA', 'AC', 'TT', 'CG']
}

df = pd.DataFrame(data) # For reproductibiliy, you should include this kind of code in your next questions :)

for col_name in list(df.columns[2:]): # iterate on all column after the third one
    df[col_name] = df[col_name].apply(lambda x: f"{x[0]}\t{x[1]}") # split on tab

df

相关问题 更多 >