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