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

时间:2018-07-09 11:18:32

标签: python python-3.x pandas dataframe

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

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行的第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)

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

2 个答案:

答案 0 :(得分:1)

您可以连接,然后使用keep=False删除重复项:

df = pd.concat([df1, df2])\
       .drop_duplicates(subset=['num', 'Ref', 'Alt'], keep=False)

print(df)

   num Ref Alt    DP    NL
1  500   C   A  45.0  90.0
2  255   A   C  69.0  26.0
1  500   A   A  45.0  54.0
2  255   A   A  55.0  55.0

答案 1 :(得分:0)

下面的代码段为您提供了所需的输出:

import pandas as pd

df1 = 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  num
1   A  45.0  54.0   A  500
2   A  55.0  55.0   A  255


print(df1[~df1.isin(df2)[["num", "Ref", "Alt"]].all(1)])

输出:

  Alt    DP    NL Ref  num
1   A  45.0  90.0   C  500
2   C  69.0  26.0   A  255

如果要在单个数据帧中输出。您可以连接数据框并根据特定的列删除重复的行。