说我的数据框如下所示,
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_start
和ex_end
,基于该列col3
,start
和end
信息。因此,如果col3
等于EX
,则生成ex_start
和ex_end
列。但是,请保留 column 的第一个值gs
。
我尝试制作列表并将它们连接在一起,但是,我没有解决这个问题,这是我尝试过的。
df.query('col3 == "EX"').groupby('gs').agg({'start': list})
gs start
NA [11869, 12613,13221]
但是,上面的一个班轮正在使用NA
in生成带有一列列表的数据帧gs
。不是第一个值。
逻辑:
如果col3
等于EX
,则生成ex_start
并使用来自start
逗号分隔列表的值。
因此,如果col3
等于EX
,则生成第二个ex_end
并使用来自end
逗号分隔列表的值。
始终取gs
列的第一个值
任何帮助表示赞赏!
好的,下面的代码将:
gs
start
和end
为行列下列各组长具有'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] 删除。
我来说两句