簡體   English   中英

基於多列信息的條件轉換,聚合/分組數據幀

[英]Conditional converting, aggregate/ group-by of data frame based on information from multiple columns

說我的數據框如下所示,

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   

基於col3startend信息,轉換后的數據幀應具有另外兩個ex_startex_end列。 因此,如果col3等於EX ,則生成ex_startex_end列。 但是,請保留列gs的第一個值。

我嘗試制作列表並將其加入到列表中,但是,我並沒有通過,這里是我嘗試過的方法。

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

但是,以上這一行使用gs NA生成具有一列列表的數據幀。 不是第一個值。

邏輯:

  1. 如果col3等於EX ,則生成ex_start並將start中的值用作逗號分隔的列表。

    1. 因此,如果col3等於EX ,則第二個生成ex_end並將end中的值用作逗號分隔的列表。

    2. 始終取gs列的第一個值

任何幫助表示贊賞!

好的,下面的代碼將:

  • gs列具有值時開始一個新
  • col3列中每個具有'EX' 組長后面的行的startend列的值連接起來,以構建新列

碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM