我想分割混合块并分别为每列分配字母:
M1 M2 M3 M4 hybrid_block S1 S2 S3 S4
A T T A A|C C G C T
T G C T T|A A T A T
C A A C C|G G A C G
G T G T G|T C T T T
使用以下代码:
d1 = pd.concat([
df.filter(like='M'),
df.hybrid_block.str.split('|', expand=True).rename(columns='H{}'.format),
df.filter(like='S')
], axis=1)
我得到的输出:
M1 M2 M3 M4 H0 H1 S1 S2 S3 S4
A T T A A C C G C T
T G C T T A A T A T
C A A C C G G A C G
G T G T G T C T T T
我更想要:
M1 M2 M3 M4 H_x H_y S1 S2 S3 S4
A T T A A C C G C T
T G C T T A A T A T
C A A C C G G A C G
G T G T G T C T T T
此外,如果有多个混合块,我想相应地拆分它们,方法是为第一个块分配h1_x and h1_y
等唯一名称,为第二个块分配h2_x, h2_y
。
答案 0 :(得分:3)
您还可以使用ReferenceError方法:
In [107]: d1 = pd.concat([
...: df.filter(like='M'),
...: df.hybrid_block.str.extract(r'(?P<H_x>[^\|]*)\|(?P<H_y>[^\|]*)', expand=True),
...: df.filter(like='S')
...: ], axis=1)
...:
In [108]: d1
Out[108]:
M1 M2 M3 M4 H_x H_y S1 S2 S3 S4
0 A T T A A C C G C T
1 T G C T T A A T A T
2 C A A C C G G A C G
3 G T G T G T C T T T
答案 1 :(得分:2)
pandas
在重命名方法中使用字典而不是格式函数
d1 = pd.concat([
df.filter(like='M'),
df.hybrid_block.str.split('|', expand=True).rename(columns={0: 'H_x', 1: 'H_y'}),
df.filter(like='S')
], axis=1)
numpy
不确定您要执行此操作的次数或数据的大小,但这应该更快
def split_block(df):
v = df.values
i = df.columns.get_loc('hybrid_block')
col_left = df.columns[:i].tolist()
col_right = df.columns[i + 1:].tolist()
col = col_left + ['H_x', 'H_y'] + col_right
h = np.array(np.core.defchararray.split(v[:, i].astype(str), '|').tolist())
data = np.hstack([v[:, :i], h, v[:, i+1:]])
return pd.DataFrame(data, columns=col)
d1 = split_block(df)
答案 2 :(得分:1)
如果您想自动查找混合列并将其拆分,这将有效。
df = pd.DataFrame({'m1': ["A", "T"], 'hybrid1': ["A|C", "T|A"], 's1': ["C", "A"], 'hybrid2': ["B|D", "F|Z"], 'hybrid3': ["V|K", "M|L"]})
for i in range(len(df.columns)):
if (df.ix[:, i].str.len() >1).any():
df_i = pd.DataFrame(df.ix[:, i].str.split('|', expand=True).rename(columns={0: (list(df)[i])+'_x', 1: (list(df)[i])+'_y'}))
df = df.drop(df.columns[i], axis = 1)
df = pd.concat([df_i, df], axis=1)