【发布时间】:2020-01-19 14:00:47
【问题描述】:
假设我的数据框如下所示,
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列的第一个值
感谢任何帮助!
【问题讨论】:
-
什么是分组逻辑?
col1和col2的值相同吗?一个新的 group 以非 NaN gs 开头?还是另一种逻辑? -
逻辑 1. 如果
col3是EX和逻辑 2.gs列在我当前的示例中具有`ID`,它是DDX,其余的是NA所以我们需要在gs列上分组。如果条件满足,则始终使用新列ex_start中的列start中的值作为逗号分隔列表,对于ex_end列中的列end也是如此 -
我不确定哪种方法最适合我的情况
-
如果
col3不是EX怎么办?在这种情况下应该如何构建ex_start和ex_end? -
如果 col3 不是
EX它不会影响ex_start列,因为它是逗号分隔值的列表。列表应始终使用下一个值写入。
标签: python pandas group-by aggregate aggregate-functions