根据特定的列pandas获取数据框之间的差异

我有多个大数据框,根据特定的列,我需要获取它们之间的差异,同时保留其他列的数据。例如,如果我有2个数据框,如下所示。


df1:


   num    Ref   Alt    DP     NL

0  300     C     A    50.0   30.0  

1  500     C     A    45.0   90.0 

2  255     A     C    69.0   26.0

3  450     B     B    55.0   25.0

df2:


   num    Ref   Alt    DP     NL

0  300     C     A    71.0   88.0  

1  500     A     A    45.0   54.0   

2  255     A     A    55.0   55.0

3  450     B     B    70.0   15.0 

我想根据特定的列['num','Ref','Alt']获得这些数据帧之间的差异,同时保持其余列['DP','NL']的数据形式。在示例中,第2行和第2行的第0行和第3行相同(因为['num','Ref','Alt']相同),因此输出数据帧应如下所示:


df1:


   num    Ref   Alt     DP     NL

0  500     C     A     45.0   90.0   

2  255     A     C     69.0   26.0

df2:


   num    Ref   Alt    DP     NL

1  500     A     A    45.0   54.0   

2  255     A     A    55.0   55.0

或在同一数据框中获取它(如果可能)...


我尝试过考虑几种解决方案,一种是将它们连接起来,然后删除重复项,但是由于它们是bif数据帧,因此可能会导致问题,或者循环遍历这些数据帧并使用以下脚本:


temp_df = df_list[0]


for df in df_list[1:]:


    df_filtered_for_diff = pd.merge(temp_df, df, on=['num', 'Ref', 'Alt'], how='outer')                                                


    temp_df = df_filtered_for_diff


return (temp_df)

但我想知道是否有更好的解决方案?


慕森卡
浏览 142回答 2
2回答

慕侠2389804

您可以连接,然后使用删除重复项keep=False:df = pd.concat([df1, df2])\       .drop_duplicates(subset=['num', 'Ref', 'Alt'], keep=False)print(df)   num Ref Alt    DP    NL1  500   C   A  45.0  90.02  255   A   C  69.0  26.01  500   A   A  45.0  54.02  255   A   A  55.0  55.0

万千封印

下面的代码段为您提供了所需的输出:import pandas as pddf1 = pd.DataFrame([{"num": 300, "Ref": "C", "Alt": "A", "DP": 50.0, "NL": 30.0},                    {"num": 500, "Ref": "C", "Alt": "A", "DP": 45.0, "NL": 90.0},                    {"num": 255, "Ref": "A", "Alt": "C", "DP": 69.0, "NL": 26.0},                    {"num": 450, "Ref": "B", "Alt": "B", "DP": 55.0, "NL": 25.0}])df2 = pd.DataFrame([{"num": 300, "Ref": "C", "Alt": "A", "DP": 71.0, "NL": 88.0},                    {"num": 500, "Ref": "A", "Alt": "A", "DP": 45.0, "NL": 54.0},                    {"num": 255, "Ref": "A", "Alt": "A", "DP": 55.0, "NL": 55.0},                    {"num": 450, "Ref": "B", "Alt": "B", "DP": 70.0, "NL": 15.0},])print(df2[~df2.isin(df1)[["num", "Ref", "Alt"]].all(1)])输出:  Alt    DP    NL Ref  num1   A  45.0  54.0   A  5002   A  55.0  55.0   A  255print(df1[~df1.isin(df2)[["num", "Ref", "Alt"]].all(1)])输出:  Alt    DP    NL Ref  num1   A  45.0  90.0   C  5002   C  69.0  26.0   A  255如果要在单个数据帧中输出。您可以连接数据框并根据特定的列删除重复的行。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python