【问题标题】:Pandas - split text with values in parenthesis into multiple columnsPandas - 将带有括号中的值的文本拆分为多列
【发布时间】:2020-01-22 09:04:00
【问题描述】:

我有一个数据框列,其值如下:

HexNAc(6)Hex(7)Fuc(1)NeuAc(3)
HexNAc(6)Hex(7)Fuc(1)NeuAc(3)
HexNAc(5)Hex(4)NeuAc(1)
HexNAc(6)Hex(7)

我想将此信息分成多列:

HexNAc Hex Fuc NeuAc
6      7   1   3
6      7   1   3
5      4   0   1
6      7   0   0

最好的方法是什么?

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    可以通过字符串拆分和explode(pandas 版本 >= 0.25)然后pivot 的组合来完成。其余的清理一些列并填充缺失值。

    import pandas as pd
    s = pd.Series(['HexNAc(6)Hex(7)Fuc(1)NeuAc(3)', 'HexNAc(6)Hex(7)Fuc(1)NeuAc(3)',
                   'HexNAc(5)Hex(4)NeuAc(1)', 'HexNAc(6)Hex(7)'])
    
    (pd.DataFrame(s.str.split(')').explode().str.split('\(', expand=True))
       .pivot(columns=0, values=1)
       .rename_axis(None, axis=1)
       .dropna(how='all', axis=1)
       .fillna(0, downcast='infer'))
    

      Fuc Hex HexNAc NeuAc
    0   1   7      6     3
    1   1   7      6     3
    2   0   4      5     1
    3   0   7      6     0
    

    【讨论】:

    • 我也采取了同样的方法 :) 你在那里打败了我:(df['col'].str.split(')').explode().str.split('\(',expand=True).dropna() .set_index(0,append=True).unstack(fill_value=0))
    • 谢谢 ALollz 和@anky_91 - 这个解决方案对我来说很有意义,但是当我尝试它时,我收到以下错误:AttributeError: 'Series' object has no attribute 'explode' 有什么想法吗?
    • @kkhatri99 尝试将 pandas 版本更新到版本 .25.0 ,您可以使用 pd.__version__ 检查当前版本
    • @anky_91 找到替代方案 :-)
    【解决方案2】:

    检查

    pd.DataFrame(s.str.findall('\w+').map(lambda x : dict(zip(x[::2], x[1::2]))).tolist())
    Out[207]: 
       Fuc Hex HexNAc NeuAc
    0    1   7      6     3
    1    1   7      6     3
    2  NaN   4      5     1
    3  NaN   7      6   NaN
    

    【讨论】:

    • 超酷的方法! (虽然十进制值可能会变得棘手:d)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2023-02-17
    相关资源
    最近更新 更多