在一定条件下合并2个Pandas DataFrame

时间:2019-12-24 18:06:16

标签: python python-3.x pandas dataframe merge

我不知道如何在特定条件下合并2个pandas DataFrame。

我有这个:

int*

我需要了解这个

我只需要合并df1中存在的名称,但要添加df2中存在的日期。但是,这些日期应该大于10/13/2019。

我能得到的最接近的是

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'], 
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'], 
                    'Value 3': [2, 2, 22, 44, 222]})

但这包括所有内容(df2中的'C'-我不需要它,并且在2019年10月13日为'B'-我也不需要它)。

非常感谢您的帮助。

编辑: 我们可以删除日期大于10/13/2019的条件-我通过创建另一个df2_mod来解决这个问题,其中我没有包含不需要的日期。但是,df2_mod中存在的某些日期不在df1中,因此我需要将它们与值3合并。但是,我不需要df1中不存在的从df2到df1的名称

1 个答案:

答案 0 :(得分:0)

这是一种解决方案(如更新的问题所述,我不过滤日期大于10/13/2019的日期):

  1. 我们首先过滤df2并删除'Names'中不存在的所有df1
  2. 在名称和日期列上使用df1df2_filtered进行外部联接
  3. 排序值并重新创建索引

import pandas as pd

df1 = pd.DataFrame({'Name': ['A', 'A', 'A', 'B' ,'B' ,'B'],
                    'Date': ['10/15/2019', '10/16/2019', '10/17/2019', '10/15/2019', '10/16/2019', '10/17/2019'],
                    'Value 1': [101, 102, 103, 201, 202, 203],
                    'Value 2': ['A1', 'A2', 'A3', 'B1', 'B2', 'B3']})

df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B' ,'C'],
                    'Date': ['10/14/2019', '10/15/2019', '10/13/2019', '10/18/2019', '10/18/2019'],
                    'Value 3': [2, 2, 22, 44, 222]})

df2_filtered = df2[df2['Name'].isin(df1['Name'])]       # we want df2 rows with `Names` that exists in df1
print(df1.merge(df2_filtered, on=['Name', 'Date'], how='outer').sort_values(['Name', 'Date']).reset_index(drop=True))

打印:

  Name        Date  Value 1 Value 2  Value 3
0    A  10/14/2019      NaN     NaN      2.0
1    A  10/15/2019    101.0      A1      2.0
2    A  10/16/2019    102.0      A2      NaN
3    A  10/17/2019    103.0      A3      NaN
4    B  10/13/2019      NaN     NaN     22.0
5    B  10/15/2019    201.0      B1      NaN
6    B  10/16/2019    202.0      B2      NaN
7    B  10/17/2019    203.0      B3      NaN
8    B  10/18/2019      NaN     NaN     44.0