基于多列信息的数据框的条件转换、聚合/分组

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   

根据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。不是第一个值。

逻辑:

    如果col3 等于EX,则生成ex_start 并使用来自start 的值作为逗号分隔的列表。

      因此,如果col3 等于EX,则生成第二个ex_end 并使用来自end 的值作为逗号分隔的列表。

      始终取gs 列的第一个值

感谢任何帮助!

【问题讨论】:

什么是分组逻辑? col1col2 的值相同吗?一个新的 group 以非 NaN gs 开头?还是另一种逻辑? 逻辑 1. 如果 col3EX 和逻辑 2. gs 列在我当前的示例中具有`ID`,它是 DDX,其余的是 NA 所以我们需要在gs 列上分组。如果条件满足,则始终使用新列 ex_start 中的列 start 中的值作为逗号分隔列表,对于 ex_end 列中的列 end 也是如此 我不确定哪种方法最适合我的情况 如果col3 不是EX 怎么办?在这种情况下应该如何构建ex_startex_end 如果 col3 不是 EX 它不会影响 ex_start 列,因为它是逗号分隔值的列表。列表应始终使用下一个值写入。 【参考方案1】:

好的,下面的代码将:

gs 列有值时开始一个新的startend 列的值连接到每个组领导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 是不需要的字符串。我现在已经用真正的字符串替换了它们。他们不是NAs。对于那个很抱歉。因此,seound 行没有正确生成 ix 列。

以上是关于基于多列信息的数据框的条件转换、聚合/分组的主要内容,如果未能解决你的问题,请参考以下文章

在 Python/Pandas 中执行不同操作的多列有条件地聚合分组数据

pyspark中基于条件对多列进行分组的累积和函数

Python 数据处理(三十九)—— groupby(过滤)

使用 np.where 基于多列的 pandas 多个条件

链接查询和分组查询

连接查询和分组查询