Python 基于数据帧中的其他列值在列之间移动行值

Python 基于数据帧中的其他列值在列之间移动行值,python,pandas,Python,Pandas,我有一个熊猫的数据框,里面有一系列的生物名称和它们的抗生素敏感性。我希望根据以下规则,在下面的数据框中将所有生物体合并到一列中 如果ORG1==A,则什么也不做 如果ORG1!=A和ORG2==A,将ORG2值移动到ORG1列中 如果ORG1!=A和ORG3==A,将ORG3值移动到ORG1列中 如果满足条件2,以及将ORG2值移动到ORG1列,也将AS20*中的列值移动到AS10* 类似地,如果满足条件3,以及将ORG3值移动到ORG1列,也将AS30*中的列值移动到AS10* 我自己根据上述

我有一个熊猫的数据框,里面有一系列的生物名称和它们的抗生素敏感性。我希望根据以下规则,在下面的数据框中将所有生物体合并到一列中

  • 如果ORG1==A,则什么也不做

  • 如果ORG1!=A和ORG2==A,将ORG2值移动到ORG1列中

  • 如果ORG1!=A和ORG3==A,将ORG3值移动到ORG1列中

  • 如果满足条件2,以及将ORG2值移动到ORG1列,也将AS20*中的列值移动到AS10*

    类似地,如果满足条件3,以及将ORG3值移动到ORG1列,也将AS30*中的列值移动到AS10*

    我自己根据上述规则编写了一个函数,并在以下方面取得了有限的成功:

    If ORG2 == A:
           return ORG1.map(ORG2)
    
    当我试图根据条件顺序映射AS201->AS101、AS202->AS102、AS203->AS103等时,我迷路了

    我的另一个问题是,生物体的名字不是一个字母,美丽的名字也不是。示例中的A相当于我的数据集中的
    re.match('aureus')

    此外,每个ORG列有20个AS列,超过150000条记录,因此我希望它可以推广到任何数量的抗生素敏感性结果

    我有点挣扎,所以朝着正确的方向推几下会很有帮助

    提前谢谢

    Index ORG1 ORG2 ORG3 AB1 AS101 AS201 AS301 AB2 AS102 AS202 AS302 1 A NaN NaN pen S NaN NaN dfluc S NaN NaN 2 A B C pen R S S dfluc S R S 3 B A B pen S S R dfluc S S R 4 A NaN NaN pen R NaN NaN dfluc S NaN NaN 5 A NaN NaN pen R NaN NaN dfluc S NaN NaN 6 C A A pen S R R dfluc R S R 7 B NaN A pen R NaN S dfluc S NaN S 8 A B A pen R R R dfluc R R R 9 A NaN NaN pen R NaN NaN dfluc S NaN NaN 索引ORG1 ORG2 ORG3 AB1 AS101 AS201 AS301 AS102 AS202 AS302 1 A楠楠笔S楠楠dfluc S楠楠楠 2 A B C笔R S dfluc S R S 3 B A B笔S R dfluc S R 4 A楠楠笔R楠楠楠dfluc S楠楠楠楠 5 A NaN NaN pen R NaN NaN dfluc S NaN NaN NaN 6 C A A pen S R R dfluc R S R 7 B NaN A pen R NaN S dfluc S NaN S 8 A B A笔R R R R R R R R 9 A楠楠钢笔R楠楠dfluc S楠楠楠
    我们可以选择
    ORG1!=A
    ORG2==A

    mask = (df['ORG1'] != 'A')&(df[orgi] == 'A')
    
    df[orgi].str.contains('aureus') == True
    
    mask
    则是一个布尔级数。要将值从ORG2复制到ORG1,我们可以使用

    df['ORG1'][mask] = df['ORG2'][mask]
    
    或者,因为我们知道右边的值是
    A
    ,所以我们可以使用

    df['ORG1'][mask] = 'A'
    
    复制AS列也可以类似地完成


    我们可以找到列值包含一些字符串的行,如带有

    mask = (df['ORG1'] != 'A')&(df[orgi] == 'A')
    
    df[orgi].str.contains('aureus') == True
    
    str.contains
    可以将任何regex模式作为其参数。 请参阅文档:

    注意:通常使用
    df[orgi].str.contains('aureus')
    (没有
    ==True
    ,但是由于
    df[orgi]
    可能包含
    NaN
    值,我们还需要将
    NaN
    s映射为False,因此我们使用
    df[orgi].str.contains('aureus')==True


    屈服

       Index ORG1 ORG2 ORG3  AB1 AS101 AS201 AS301    AB2 AS102 AS202 AS302
    0      1    A  NaN  NaN  pen     S   NaN   NaN  dfluc     S   NaN   NaN
    1      2    A    B    C  pen     R     S     S  dfluc     S     R     S
    2      3    A    A    B  pen     S     S     R  dfluc     S     S     R
    3      4    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
    4      5    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
    5      6    A    A    A  pen     R     R     R  dfluc     S     S     R
    6      7    A  NaN    A  pen     S   NaN     S  dfluc     S   NaN     S
    7      8    A    B    A  pen     R     R     R  dfluc     R     R     R
    8      9    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
    

    请注意,如果
    ORG2==A
    ORG3==A
    ,那么
    AS20*
    列和
    AS30*
    列中的值都会竞争覆盖
    AS10*
    列中的值。我不确定您想赢哪个值。在上面的代码中,最后一列赢了,这将是
    AS30*
    ,谢谢@unutbuul.除了
    mask=(df['ORG1']!='A')&(df[orgi]='A')
    ,我如何在ORG1和mask中的orgi上使用正则表达式进行掩码?我尝试了
    mask=(在df.ORG1中重新搜索('aureus',x)!=None表示x)和(在df[orgi中重新搜索('aureus',x)!=None表示x)
    现在,我添加了一些关于如何对具有字符串值的列执行正则表达式搜索的内容。非常感谢。这是一个巨大的更新。如果模式匹配,我添加了一个更新,将有机体名称移到ORG1列。如果ORG2和ORG3匹配,我不喜欢哪列获胜。机会很小(非常小)不管怎样,我还是把我想要的有机体整合到一个列中。