Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用分隔符拆分pandas中的列,并在此过程中指定自定义的唯一名称?_Python_Pandas_Split - Fatal编程技术网

Python 如何使用分隔符拆分pandas中的列,并在此过程中指定自定义的唯一名称?

Python 如何使用分隔符拆分pandas中的列,并在此过程中指定自定义的唯一名称?,python,pandas,split,Python,Pandas,Split,我要拆分一个混合块,并分别为每列指定字母: 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

我要拆分一个混合块,并分别为每列指定字母:

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
此外,如果有超过1个混合块,我希望通过为第一个块分配一个唯一的名称,如
h1_x和h1_y
,为第二个块分配
h2_x,h2_y


在重命名方法中使用字典而不是格式函数

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)
您也可以使用以下方法:

[107]中的
d1=pd.concat([
…:df.filter(like='M'),
…:df.hybrid|u block.str.extract(r'(?P[^\\\\]*)\\\\(?P[^\\\\]*)),expand=True),
…:df.filter(like='S')
…:],轴=1)
...:
In[108]:d1
出[108]:
M1 M2 M3 M4 H_x H_y S1 S2 S3 S4
0 A T A C C G C T
1 T G C T A T A T A T
2 C A C G A C G G
3GTGTGTT

如果您想自动查找混合列并拆分它们,这将是可行的

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)
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)