首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用分隔符拆分pandas中的列,并在流程中分配自定义的唯一名称?

如何使用分隔符拆分pandas中的列,并在流程中分配自定义的唯一名称?
EN

Stack Overflow用户
提问于 2017-02-01 04:20:05
回答 3查看 192关注 0票数 2

我想拆分一个混合块,并将字母分别分配给每一列:

代码语言:javascript
运行
复制
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 

使用以下代码:

代码语言:javascript
运行
复制
d1 = pd.concat([
    df.filter(like='M'),
    df.hybrid_block.str.split('|', expand=True).rename(columns='H{}'.format),
    df.filter(like='S')
], axis=1)

我得到的输出:

代码语言:javascript
运行
复制
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

我更想要:

代码语言:javascript
运行
复制
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 and h1_y,为第二个块分配h2_x, h2_y,来相应地拆分所有这些块。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-01 04:45:55

pandas

在rename方法中使用字典而不是format函数

代码语言:javascript
运行
复制
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

不确定您要执行此操作的次数,也不确定您的数据量有多大,但这应该会更快

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-02-01 04:48:48

您也可以使用.str.extract()方法:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2017-02-01 05:44:02

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

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41966763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档