![](/img/trans.png)
[英]Group-by and aggregate a data frame with conditions of values from two column
[英]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
基於col3
, start
和end
信息,轉換后的數據幀應具有另外兩個ex_start
和ex_end
列。 因此,如果col3
等於EX
,則生成ex_start
和ex_end
列。 但是,請保留列gs
的第一個值。
我嘗試制作列表並將其加入到列表中,但是,我並沒有通過,這里是我嘗試過的方法。
df.query('col3 == "EX"').groupby('gs').agg({'start': list})
gs start
NA [11869, 12613,13221]
但是,以上這一行使用gs
NA
生成具有一列列表的數據幀。 不是第一個值。
邏輯:
如果col3
等於EX
,則生成ex_start
並將start
中的值用作逗號分隔的列表。
因此,如果col3
等於EX
,則第二個生成ex_end
並將end
中的值用作逗號分隔的列表。
始終取gs
列的第一個值
任何幫助表示贊賞!
好的,下面的代碼將:
gs
列具有值時開始一個新組 col3
列中每個具有'EX'
組長后面的行的start
和end
列的值連接起來,以構建新列 碼:
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.