为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2021-04-08 14:15:23
我有多个大数据框,根据特定的列,我需要获取它们之间的差异,同时保留其他列的数据。例如,如果我有2个数据框,如下所示。df1:   num    Ref   Alt    DP     NL0  300     C     A    50.0   30.0  1  500     C     A    45.0   90.0 2  255     A     C    69.0   26.03  450     B     B    55.0   25.0df2:   num    Ref   Alt    DP     NL0  300     C     A    71.0   88.0  1  500     A     A    45.0   54.0   2  255     A     A    55.0   55.03  450     B     B    70.0   15.0 我想根据特定的列['num','Ref','Alt']获得这些数据帧之间的差异,同时保持其余列['DP','NL']的数据形式。在示例中,第2行和第2行的第0行和第3行相同(因为['num','Ref','Alt']相同),因此输出数据帧应如下所示:df1:   num    Ref   Alt     DP     NL0  500     C     A     45.0   90.0   2  255     A     C     69.0   26.0df2:   num    Ref   Alt    DP     NL1  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_diffreturn (temp_df)但我想知道是否有更好的解决方案?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

您可以连接,然后使用删除重复项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



查看完整回答
反对 回复 2021-04-27
?
万千封印

TA贡献1891条经验 获得超3个赞

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


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

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


查看完整回答
反对 回复 2021-04-27
  • 2 回答
  • 0 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信