我是新来的,这是我的第一个问题。如果我做错了,我很抱歉。
我有一些DataFrames,我需要在存在相同ID但保留两行的情况下加入它们。例如:
表A:
ID | pID | 代码 | 条件|
---|---|---|---|
1 | 10 | "bl">"Normal"> | |
2 | 11 | 'bl' | >'MCI' |
3 | 12 | "bl">"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 10
和pID 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'