【问题标题】:Splitting in multiple columns values that are separated by a comma拆分为用逗号分隔的多列值
【发布时间】:2019-06-25 16:18:53
【问题描述】:

我有以下数据集

Chr     Position       Name      AD                                 
1       866511          A       13,21
1       881627          A       28,33
2       1599812         B       67,25 

我需要将 AD 列拆分为三列 [REF, ALT1, ALT2]。 当 AD 的每一行只有两个值时,我仍然需要用 NaN 值填充 ALT2 列。

如果 AD 包含具有三个值的行,则以下代码有效

df['REF'], df['ALT1'], df['ALT2'] = df['AD'].str.split(',', 2).str

但是,在某些情况下,对于每一行,数据集在 AD 列中仅包含两个值,当我运行同一行时,我收到以下错误消息:

ValueError: not enough values to unpack (expected 3, got 2)

在这种情况下,我希望仍然保留第三列 ALT2 并用 NaN 值填充它。有什么建议吗?谢谢大家,愿意帮忙的人。

【问题讨论】:

  • 如果您知道只有 3 或 2 个,您可以使用 if 语句(或 try catch)来遍历这两个选项

标签: python pandas split


【解决方案1】:

add 一个额外的','

df['REF'], df['ALT1'], df['ALT2'] = zip(*df.AD.add(',').str.split(',').str[:3])

df

   Chr  Position Name        AD REF ALT1 ALT2
0    1    866511    A     13,21  13   21     
1    1    881627    A  28,33,31  28   33   31
2    2   1599812    B     67,25  67   25     

或者不改变df

df.assign(**dict(zip('REF ALT1 ALT2'.split(), zip(*df.AD.add(',').str.split(',').str[:3]))))

   Chr  Position Name        AD REF ALT1 ALT2
0    1    866511    A     13,21  13   21     
1    1    881627    A  28,33,31  28   33   31
2    2   1599812    B     67,25  67   25     

【讨论】:

  • piRSquared 非常感谢您,您修复得如此之快,对我来说效果很好。我只添加了print(df.replace(r'^\s*$', np.nan, regex=True)) 以用 NaN 填充空格。
【解决方案2】:

您可以将参数expand 设置为True,然后使用:

df['REF'], df['ALT1'], df['ALT2'] = df.AD.str.split(',', 2, expand=True).values.T

我在 df.loc[3,:] = [3,5432,'C', '32,45,65'] 的 AD 列中添加了一行包含 3 个值的行,您得到:

   Chr   Position Name        AD REF ALT1  ALT2
0  1.0   866511.0    A     13,21  13   21  None
1  1.0   881627.0    A     28,33  28   33  None
2  2.0  1599812.0    B     67,25  67   25  None
3  3.0     5432.0    C  32,45,65  32   45    65

【讨论】:

    【解决方案3】:

    你可以做rename和concat:

    df = pd.concat((df, df['AD'].str.split(',', expand=True)
                                .rename(columns={0:'REF',1:'ALT1',2:'ALT2'})
                   ), axis=1)
    

    输出:

       Chr  Position Name     AD REF ALT1
    0    1    866511    A  13,21  13   21
    1    1    881627    A  28,33  28   33
    2    2   1599812    B  67,25  67   25
    

    【讨论】:

    • Quang Hoang 我仍然需要 ALT2 列。 PiRsquared 工作得非常好。谢谢大家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2018-09-25
    • 2012-05-21
    相关资源
    最近更新 更多