合并行时,对每列执行不同的操作

2024-05-18 17:51:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个轻量级的熊猫用户,我遇到了一个棘手的情况。我想合并“case\u id”周围的数据集行。合并时,如果字符串是唯一的,我希望“Gene”列按字母顺序将字符串与“->;”连接起来。另外,有些列有0,有些列有1,我希望合并时用1代替0。你知道吗

df.groupby('case_id').agg(special_merge)

def special_merge(data):
    //Handle 'Gene' Column ex. KRAS->SMAD4->TP53
    //Handle 0 vs 1

enter image description here


Tags: 数据字符串用户gtid顺序字母情况
2条回答

我准备了一个示例数据框架,基于我如何理解您的输入数据。然后您可以看到创建新数据帧所做的聚合。你知道吗

orig_df = pd.DataFrame({'case_id':[1,2,3,2,1],'Gene':['KRAS','SMAD4','TP53','SMAD4','OTHER'],'col_X':[1,0,0,1,0], 'col_X2':[0,0,0,0,1})

    case_id Gene    col_X   col_X2
0   1       KRAS    1       0
1   2       SMAD4   0       0
2   3       TP53    0       0
3   2       SMAD4   1       0
4   1       BLAH    0       1

new_df = pd.DataFrame()

#lambda function identifies unique values of Gene and sorts them
new_df['Strings'] = orig_df.groupby('case_id')['Gene'].apply(lambda x: sorted(x.unique())).transform(lambda x: '->'.join(x))

#here, max function is used to take 1 during aggregation if 0's and 1's are present
cols_to_agg = [col for col in orig_df if col.startswith('col_')]
new_df[cols_to_agg] = orig_df.groupby('case_id')[cols_to_agg].agg(max)

    Strings col_X   col_X2
case_id     
1   BLAH->KRAS  1   1
2   SMAD4       1   0
3   TP53        0   0

import pandas as pd

df = pd.DataFrame({'case_id':['1', '1', '1','2','2','2'],
'Gene':['KRAS','SMAD4','TP53','TP000','SMAD000','TP000'],
'ch_a':[0,1,0,0,0,0], 'ch_b':[0,0,0,1,1,0], 'ch_c':[0,0,0,1,1,0]})

  case_id     Gene  ch_a  ch_b  ch_c
0       1     KRAS     0     0     0
1       1    SMAD4     1     0     0
2       1     TP53     0     0     0
3       2    TP000     0     1     1
4       2  SMAD000     0     1     1
5       2    TP000     0     0     0

1)按大小写排序\u id,Gene

2)应用lambda连接组上唯一的排序字符串

3)应用max将二进制变量(由列掩码定义)连接到组上

4)合并两个结果

binary_cols = df.columns[df.columns.str.contains('^ch_')]

df_case_gene = df.groupby('case_id')['Gene'].agg(lambda x: '->'.join(x.sort_values().unique())).reset_index()

df_case_binary_cols = df.groupby('case_id')[binary_cols].agg('max').reset_index()

df_final = df_case_gene.merge(df_case_binary_cols)

df\U最终:

  case_id               Gene  ch_a  ch_b  ch_c
0       1  KRAS->SMAD4->TP53     1     0     0
1       2     SMAD000->TP000     0     1     1

相关问题 更多 >

    热门问题