我不知道如何在特定条件下合并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的名称
答案 0 :(得分:0)
这是一种解决方案(如更新的问题所述,我不过滤日期大于10/13/2019的日期):
df2
并删除'Names'
中不存在的所有df1
df1
和df2_filtered
进行外部联接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