在连接的数据框中搜索完全匹配,然后提取最小日期

时间:2018-07-20 19:29:37

标签: python pandas csv dataframe data-science

所以我是熊猫的新手,在这里超重。我有两个csv文件:一个是我感兴趣的作者列表(数据框1),第二个文件是出版公司及其出版日期的作者总列表(数据框2)。

我需要使用数据框1来查看数据框2中是否存在完全匹配的名称。如果存在匹配项(可以有多个匹配项),我想提取最小日期。例如:对于df 1中的Jake Smith,在df 2中可能有2个匹配项,我想将最早的发布日期添加到数据帧1中。

df

first name|last name |

df 2

first name|last name| publication date

所需

如果作者在df1中,则在df1中添加最低发布日期

这就是我所做的。我从csv文件创建了数据帧,并连接了所有作者文件以创建df2。然后,我对名字和姓氏进行了内部联接,因为我认为这将是命名匹配的最佳方法。我不断收到错误消息。然后,我使用了一个group by来尝试获取最短日期。

import pandas as pd

files_path= 'C:'
df_1 = pd.read_csv( files_path + '/author_desired.csv', sep="|")

df_merged= pd.read_csv(files_path +'/master_list.csv', sep="|")

df_final= pd.join(df_1, df_merged, on= ['LAST_NAME' , 'FIRST_NAME'], how='inner')

df_final.groupby(['FIRST_NAME', 'LAST_NAME']).max()['FIRST_PUB_DATE']

df_final.to_csv(files_path + "/merged_file.csv")

请帮助

1 个答案:

答案 0 :(得分:0)

lis1=[{'FIRST_NAME':'James','Last_Name':'Cameran','City':'NYC'},{'FIRST_NAME':'Samuel','Last_Name':'Smith','City':'London'},{'FIRST_NAME':'Kane','Last_Name':'Win','City':'NYC'}]
lis2=[{'FIRST_NAME':'James','Last_Name':'Cameran','Pub. Year':2011},{'FIRST_NAME':'Kane','Last_Name':'Win','Pub. Year':2010},{'FIRST_NAME':'James','Last_Name':'Cameran','Pub. Year':2018},{'FIRST_NAME':'Kane','Last_Name':'Win','Pub. Year':2014}]
import pandas as pd
df1=pd.DataFrame(lis1)
df2=pd.DataFrame(lis2)

print(df1)
print(df2)

df1['Full_Name']=df1.FIRST_NAME+" "+df1.Last_Name
df2['Full_Name']=df2.FIRST_NAME+" "+df2.Last_Name

merged=pd.merge(df1,df2)[['Full_Name','Pub. Year']]

df1['Pub. Year']=[merged[merged.Full_Name==fullname]['Pub. Year'].min() for fullname in df1.Full_Name]
print(df1)

输出:

     City FIRST_NAME Last_Name
0     NYC      James   Cameran
1  London     Samuel     Smith
2     NYC       Kane       Win

     FIRST_NAME Last_Name  Pub. Year
0      James   Cameran       2011
1       Kane       Win       2010
2      James   Cameran       2018
3       Kane       Win       2014

     City FIRST_NAME Last_Name      Full_Name  Pub. Year
0     NYC      James   Cameran  James Cameran     2011.0
1  London     Samuel     Smith   Samuel Smith        NaN
2     NYC       Kane       Win       Kane Win     2010.0