Python 基于多列信息的数据帧条件转换、聚合/分组

Python 基于多列信息的数据帧条件转换、聚合/分组,python,pandas,group-by,aggregate,aggregate-functions,Python,Pandas,Group By,Aggregate,Aggregate Functions,假设我的数据框如下所示 df.head() col1 col2 col3 start end gs chr1 HAS GEN 11869 14409 DDX chr1 HAS TRANS 11869 14409 Tp1 chr1 HAS EX 11869 12227 Tp2 chr1 HAS EX 12613 12721 Tp3 chr1 HAS EX 13221 14409 Tp4 我想将上

假设我的数据框如下所示

df.head()
 col1   col2    col3    start   end gs
chr1    HAS GEN 11869   14409   DDX
chr1    HAS TRANS   11869   14409   Tp1
chr1    HAS EX  11869   12227   Tp2
chr1    HAS EX  12613   12721   Tp3
chr1    HAS EX  13221   14409   Tp4
我想将上面的数据框或组按上面的数据框转换为

df_converted.head()
gs  chr      strt   end           ex_start           ex_end 
DDX chr1    11869   14409   11869, 12613,13221  12227,12721,14409   
根据列
col3
start
end
信息,转换后的数据帧应具有两个附加列
ex\u start
ex\u end
。因此,如果
col3
等于
EX
,则生成
EX\u start
EX\u end
列。但是,保留列
gs
的第一个值

我试着制作列表并将它们连接在一起,但是,我没有完成这项工作,以下是我所做的尝试

df.query('col3 == "EX"').groupby('gs').agg({'start': list})
gs  start
NA  [11869, 12613,13221] 
然而,这上面的一行程序正在生成带有列表列的数据帧 在
gs
中使用
NA
。不是第一个值

逻辑:

  • 如果
    col3
    等于
    EX
    ,则生成
    EX\u start
    并使用
    start
    中的值作为逗号分隔的列表

  • 因此,如果
    col3
    等于
    EX
    ,则生成第二个
    EX\u end
    并使用
    end
    中的值作为逗号分隔的列表

  • 始终取
    gs
    列的第一个值


  • 感谢您的帮助

    好,以下代码将:

    • gs
      列有值时,启动一个新组
    • 开始
      结束
      列的值连接到
      col3
      列中具有
      'EX'
      的每个组长后面的行,以构建新列
    代码:

    结果数据帧与预期一致:

        gs  chr  start    end           ex_start             ex_end
    0  DDX  HAS  11869  14409  11869,12613,13221  12227,12721,14409
    

    好的,下面的代码将:

    • gs
      列有值时,启动一个新组
    • 开始
      结束
      列的值连接到
      col3
      列中具有
      'EX'
      的每个组长后面的行,以构建新列
    代码:

    结果数据帧与预期一致:

        gs  chr  start    end           ex_start             ex_end
    0  DDX  HAS  11869  14409  11869,12613,13221  12227,12721,14409
    

    分组逻辑是什么?
    col1
    col2
    的值相同吗?在每行上使用非NaN gs启动一个新组?还是另一种逻辑?逻辑1。如果
    col3
    EX
    和逻辑2。在我当前的示例中,
    gs
    列有'ID',它是
    DDX
    ,其余的是
    NA
    ,因此我们需要按
    gs
    列分组。如果条件满足,则始终在新列中使用列
    start
    中的值作为逗号分隔的列表,对于列
    end
    中的列
    end
    我不确定什么最适合我的情况如果
    col3
    不是
    ex
    ?在这种情况下,应该如何构建
    ex\u start
    ex\u end
    ?如果col3不是
    ex
    ,它将不会影响
    ex\u start
    列,因为它是逗号分隔值的列表。列表应始终使用下一个值写入。分组逻辑是什么?
    col1
    col2
    的值相同吗?在每行上使用非NaN gs启动一个新组?还是另一种逻辑?逻辑1。如果
    col3
    EX
    和逻辑2。在我当前的示例中,
    gs
    列有'ID',它是
    DDX
    ,其余的是
    NA
    ,因此我们需要按
    gs
    列分组。如果条件满足,则始终在新列中使用列
    start
    中的值作为逗号分隔的列表,对于列
    end
    中的列
    end
    我不确定什么最适合我的情况如果
    col3
    不是
    ex
    ?在这种情况下,应该如何构建
    ex\u start
    ex\u end
    ?如果col3不是
    ex
    ,它将不会影响
    ex\u start
    列,因为它是逗号分隔值的列表。列表中应始终包含下一个值。感谢您的解决方案。对不起,我的问题不清楚。我主要问题中的
    NAs
    是不需要的字符串。我现在用真正的字符串替换它们。他们不是
    NA
    s。很抱歉。因此seound行无法正确生成
    ix
    列。感谢您的解决方案。对不起,我的问题不清楚。我主要问题中的
    NAs
    是不需要的字符串。我现在用真正的字符串替换它们。他们不是
    NA
    s。很抱歉。因此seound行没有正确地生成
    ix
    列。