【问题标题】:Pandas merging columns by reverse compliment string熊猫通过反向补充字符串合并列
【发布时间】:2018-09-12 23:21:59
【问题描述】:

所以我被困在如何在 pandas 中处理数据操作技术上。我在下面有一个示例数据框,每行有 25 个计数。 我想通过反向补充序列合并列名。

   AA CC GG AT TT

    4  7  0  9  5
    3  8  5  5  2
    8  6  2  8  1

“AA”和“TT”列是反向互补,“CC”和“GG”也是如此

   AA/TT CC/GG AT 

    9     7     9
    5     13    5
    9     8     8

如何匹配列名的反向补充并将其与另一列的名称合并。

注意:我已经有了一个函数来查找字符串的反向补语

【问题讨论】:

    标签: python pandas dataframe merge data-manipulation


    【解决方案1】:

    我建议使用pd.concat 创建一个新框架:

    new_df = pd.concat([df[['AA', 'TT']].sum(1).rename('AA/TT'),
                        df[['CC', 'GG']].sum(1).rename('CC/GG'),
                        df['AT']], axis=1)
    
    >>> new_df
       AA/TT  CC/GG  AT
    0      9      7   9
    1      5     13   5
    2      9      8   8
    

    更一般地说,您可以在列表理解中做到这一点。鉴于反向赞美:

    reverse_compliments = [['AA','TT'], ['CC','GG']]
    

    在您的原始数据框列中找到那些不反向赞美的值(这里可能有更好的方法,但这有效):

    reverse_compliments.append(df.columns.difference(
        pd.np.array(reverse_compliments)
        .flatten()))
    

    并使用pd.concat 和列表理解:

    new_df = pd.concat([df[x].sum(1).rename('/'.join(x)) for x in reverse_compliments],
                       axis=1)
    
    >>> new_df
       AA/TT  CC/GG  AT
    0      9      7   9
    1      5     13   5
    2      9      8   8
    

    【讨论】:

    • 嗨@sacul,这适用于这个演示示例,我认为它让我朝着正确的方向前进。有没有比单独输入每个反向恭维更pythonic的方式来调用列? (即,如果我有两个列名和反向赞美列表)非常感谢。我要修修补补!
    • 谢谢@sacul。这适用于我需要的东西。存在一些边缘情况(例如反向补充不在原始数据帧中时)。你太棒了,而且非常有帮助。谢谢!
    • 很高兴为您提供帮助!希望你弄清楚你的边缘情况!而且我确信有更好的方法来获取未包含的列,但我很高兴这为您指明了可以使用的方向。
    猜你喜欢
    • 2020-01-23
    • 2020-04-24
    • 2019-01-07
    • 2021-11-05
    • 2018-01-08
    • 2019-07-12
    • 2020-04-20
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多