连接两个有条件的Pandas数据帧,但保留两者



我是新来的,这是我的第一个问题。如果我做错了,我很抱歉。

我有一些DataFrames,我需要在存在相同ID但保留两行的情况下加入它们。例如:

表A:

条件"bl">>"bl">>
ID pID 代码
1 10"Normal">
2 11 'bl''MCI'
3 12"Normal">
4 15 'bl''EMCI'

编辑:

步骤1和2在更改概念后进行了编辑-它将适用于多个数据帧。

步骤1.连接所有数据帧:

dfs = [df_a, df_b, df_c]
out = pd.concat(dfs).sort_values('pID')

步骤2.保留出现在所有数据帧中的值:

out = out[out.groupby('pID')['ID'].transform('count').eq(len(dfs))].reset_index(drop=True)

步骤3.更改"ID"系列:

out['ID'] = pd.Series(range(len(out['ID']))).add(1)

输出:

ID   pID   Code    Condition
0   1    10   'bl'     'Normal'
1   2    10  'm06'  'Alzheimer'
2   3    10  'm12'  'Alzheimer'
3   4    11   'bl'        'MCI'
4   5    11  'm06'        'MCI'
5   6    11  'm12'        'MCI'

使用concat

# Names of dataframes
frames = [df1, df2, df3] 
# Concat dataframes
result = pd.concat(frames)

我假设您提到加入是因为您只想保留两个数据帧中都存在的患者。在您的示例中,pID 10pID 16也被删除。

否则,@ksmehta提出的pd.concat要容易得多。

话虽如此。你可以加入

In [10]: df = pd.merge(a.drop('ID', axis=1),b.drop('ID', axis=1), on=['pID'])
Out[10]: 
pID Code_x Condition_x  Code_y  Condition_y
0   10  'bl'     'Normal'  'm06'   'Alzheimer'
1   11  'bl'        'MCI'  'm06'         'MCI'
2   15  'bl'       'EMCI'  'm06'   'Alzheimer'

然后使用CCD_ 4来组合代码和条件字段。

In [20]: pd.wide_to_long(df, stubnames=['Code', 'Condition'], i='pID', j='xy', suffix='_.')
Out[20]: 
Code    Condition
pID xy                     
10  _x   'bl'      'Normal'
11  _x   'bl'         'MCI'
15  _x   'bl'        'EMCI'
10  _y  'm06'   'Alzheimer'
11  _y  'm06'         'MCI'
15  _y  'm06'   'Alzheimer'

为了保持关联的唯一性,引入了一个新列xy,您可以将其放入最终中

In [24]: pd.wide_to_long(df, stubnames=['Code', 'Condition'], i='pID', j='xy', suffix='_.').reset_index('xy', drop=True).sort_index()
Out[24]: 
Code    Condition
pID                     
10    'bl'      'Normal'
10   'm06'   'Alzheimer'
11    'bl'         'MCI'
11   'm06'         'MCI'
15    'bl'        'EMCI'
15   'm06'   'Alzheimer'

最新更新