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

用户1017373

说我的数据框如下所示,

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   

转换后的数据帧应该有两个附加列ex_startex_end,基于该列col3startend信息。因此,如果col3等于EX,则生成ex_startex_end列。但是,请保留 column 的第一个值gs

我尝试制作列表并将它们连接在一起,但是,我没有解决这个问题,这是我尝试过的。

df.query('col3 == "EX"').groupby('gs').agg({'start': list})
gs  start
NA  [11869, 12613,13221] 

但是,上面的一个班轮正在使用NAin生成带有一列列表的数据帧gs不是第一个值。

逻辑:

  1. 如果col3等于EX,则生成ex_start并使用来自start逗号分隔列表的值。

    1. 因此,如果col3等于EX,则生成第二个ex_end并使用来自end逗号分隔列表的值。

    2. 始终取gs的第一个值

任何帮助表示赞赏!

塞尔吉·巴列斯塔

好的,下面的代码将:

  • 列有值开始一个新gs
  • 串联的值startend为行列下列各组长具有'EX'col3构建新的列的列

代码:

df1 = df.loc[~(df['gs'].isna()), ['gs', 'col2', 'start', 'end']].rename_axis({'col2': 'chr'}, axis=1)
df.loc[~(df['gs'].isna()), 'ix'] = df.loc[~(df['gs'].isna())].index
df['ix'].ffill(inplace=True)
df2 = df.loc[df['col3']=='EX', ['ix', 'start', 'end']].groupby(['ix']).agg(
        lambda x: ','.join([str(y) for y in x]))
df2.columns= ['ex_start', 'ex_end']
result = df1.join(df2)

结果数据框符合预期:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章