基于多列信息的数据框的条件转换、聚合/分组
Posted
技术标签:
【中文标题】基于多列信息的数据框的条件转换、聚合/分组【英文标题】:Conditional converting, aggregate/ group-by of data frame based on information from multiple columns 【发布时间】: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
列,因为它是逗号分隔值的列表。列表应始终使用下一个值写入。
【参考方案1】:
好的,下面的代码将:
当gs
列有值时开始一个新的组
将start
和end
列的值连接到每个组领导在col3
列中具有'EX'
的行以构建新列
代码:
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
【讨论】:
感谢您的解决方案。抱歉,我的问题不清楚。在我的主要问题中,NAs
是不需要的字符串。我现在已经用真正的字符串替换了它们。他们不是NA
s。对于那个很抱歉。因此,seound 行没有正确生成 ix
列。以上是关于基于多列信息的数据框的条件转换、聚合/分组的主要内容,如果未能解决你的问题,请参考以下文章
在 Python/Pandas 中执行不同操作的多列有条件地聚合分组数据