分组并聚合具有两列值条件的数据框

Posted

技术标签:

【中文标题】分组并聚合具有两列值条件的数据框【英文标题】:Group-by and aggregate a data frame with conditions of values from two column 【发布时间】:2020-01-19 18:07:43 【问题描述】:

说,我有以下数据框,

df.head()
 col1   col2    col3    start   end gs
chr1    HAS GEN 11869   14409   DDX
chr1    HAS TRANS   11869   14409   Tp1 psg
chr1    HAS EX  11869   12227   Tp gn
chr1    HAS GEN  12613   12721   FXBZ
chr1    HAS EX  13221   14409   Tpghj
chr1    HAS EX  12010   12057   Tpghj

我感兴趣的专栏是col3gs。我有两个条件,

col3 应该等于 EX 如果col3 等于GEN,则使用列gs 中的值

如果col3 =="GEN",我总是希望gs 列的值为gs

最后,这就是我的目标。

  df_converted.head()
    gs  chr      strt   end           ex_start           ex_end 
    DDX chr1    11869   14409   11869, 12613,13221  12227,12721,14409 
    FXBZ chr1   12613   12721   13221,12010         14409,12057

这是我尝试过的,

df.loc[((df.col3 == "EX") | (df.col3 == "GEN")), ['gs', 'start', 'end']].groupby(['gs']).agg(
    lambda x: ','.join([str(y) for y in x]))

非常感谢任何建议/帮助!

【问题讨论】:

【参考方案1】:

你可以这样做:

df1=df.loc[df['col3'].eq('GEN'),['gs','col1','start','end']].reset_index(drop=True)
df2=pd.DataFrame()
dex=df.loc[df['col3'].eq('EX'),['start','end']]
index=df[df['col3'].eq('GEN')].index.tolist()
v1=dex[dex.index>index[1]].T.values.tolist()
v2=dex[dex.index>index[0]].T.values.tolist()
df2['ex_start']=[v2[0],v1[0]]
df2['ex_end']=[v2[1],v1[1]]
print(pd.concat([df1,df2],axis=1))


     gs  col1  start    end               ex_start                 ex_end
0   DDX  chr1  11869  14409  [11869, 13221, 12010]  [12227, 14409, 12057]
1  FXBZ  chr1  12613  12721         [13221, 12010]         [14409, 12057]

【讨论】:

感谢您的解决方案!我不确定你为什么使用 df_converted 变量,它是我想要的输出。从问题

以上是关于分组并聚合具有两列值条件的数据框的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:在具有两列的表上进行无聚合的旋转

读取两列,根据条件比较第二列值,将最终结果写入新表

SQL - 通过两列聚合问题分组

Azure 表存储:是不是可以使用与添加两列值的结果进行比较的查询条件?

Laravel:如何通过选择两列进行分组具有不同的值

VB.NET 按两列分组并将结果写入数组