拆分数据框中的几列



我有一个数据帧,我想将第 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

问题与"拆分一列"的问题不同,请帮助。

您可以通过将值拆分为具有concat连接在一起的列表来在列中创建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 字符串连接列名以避免重复的列名,然后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

你可以使用 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

最新更新