如何用Python实现日期关联对应人物传记数据的匹配?
如何用Python关联日期与对应人物的传记数据
当然可以用Python搞定这个需求!我们主要借助pandas库来处理DataFrame的变形和合并操作,下面是一步步的实现方案,完全贴合你的需求:
步骤1:导入必要的库
首先得引入pandas,它是处理表格数据的利器:
import pandas as pd
步骤2:准备示例数据
先把你提供的两个DataFrame示例转换成可操作的pandas DataFrame:
第一个宽格式DataFrame(含日期和多个人物列)
df1_data = { 'Id': [12.0, 13.0, 14.0, 15.0], 'Date': ['Sat Dec 19 00:00:00 EST 1970', 'Sat Jun 07 00:00:00 EDT 1980', 'Sat Dec 04 00:00:00 EST 2010', 'Sat Aug 09 00:00:00 EDT 1969'], 'People_1': ['Loretta Lynn', 'Sissy Spacek', 'Loretta Lynn', 'Charley Pride'], 'People_2': ['Owen Bradley', 'Loretta Lynn', 'Sheryl Crow', 'Dallas Frazier'], 'People_3': [None, 'Owen Bradley', 'Miranda Lambert', 'A.L. "Doodle"'], 'People_4': [None, None, None, 'Chet Atkins'], 'People_5': [None, None, None, 'Jack Clement'], 'People_6': [None, None, None, 'Bob Ferguson'], 'People_7': [None, None, None, 'Felton Jarvis'] } df1 = pd.DataFrame(df1_data)
第二个人物传记DataFrame
df2_data = { 'People': ['Charles Kelley', 'Hillary Scott', 'Reba McEntire', 'Wanda Jackson', 'Carrie Underwood', 'Toby Keith', 'David Bellamy', 'Howard Bellamy', 'Keith Urban', 'Miranda Lambert', 'Sam Hunt', 'Johnny Cash', 'June Carter', 'Merle Haggard', 'Waylon Jennings', 'Willie Nelson', 'Loretta Lynn', 'Sissy Spacek', 'Sheryl Crow', 'Charley Pride', 'Rodney Clawon', 'Nathan Chapman'], 'Birth_date': ['Fri Sep 11 00:00:00 EDT 1981', 'Tue Apr 01 00:00:00 EST 1986', 'Mon Mar 28 00:00:00 EST 1955', 'Wed Oct 20 00:00:00 EST 1937', 'Thu Mar 10 00:00:00 EST 1983', 'Sat Jul 08 00:00:00 EDT 1961', 'Sat Sep 16 00:00:00 EDT 1950', 'Sat Feb 02 00:00:00 EST 1946', 'Thu Oct 26 00:00:00 EDT 1967', 'Thu Nov 10 00:00:00 EST 1983', 'Sat Dec 08 00:00:00 EST 1984', 'Fri Feb 26 00:00:00 EST 1932', 'Sun Jun 23 00:00:00 EDT 1929', 'Tue Apr 06 00:00:00 EST 1937', 'Tue Jun 15 00:00:00 EDT 1937', 'Sat Apr 29 00:00:00 EST 1933', 'Thu Apr 14 00:00:00 EST 1932', 'Sun Dec 25 00:00:00 EST 1949', 'Sun Feb 11 00:00:00 EST 1962', 'Sun Mar 18 00:00:00 EST 1934', '?', '?'], 'Birth_state': ['GA', 'TN', 'OK', 'OK', 'OK', 'OK', 'FL', 'FL', 'Northland', 'TX', 'GA', 'AR', 'VA', 'CA', 'TX', 'TX', 'KY', 'TX', 'MO', 'MS', 'TX', 'TN'], 'Sex': ['Male', 'Female', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male', 'Male', 'Female', 'Male', 'Male', 'Female', 'Male', 'Male', 'Male', 'Female', 'Female', 'Female', 'Male', 'Male', 'Male'], 'Ethnicity': ['Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'Caucasian', 'African American', 'Caucasian', 'Caucasian'] } df2 = pd.DataFrame(df2_data)
步骤3:将宽表转换为长表(关键操作)
第一个DataFrame是宽格式(多个人物列),我们需要把它转成长格式(每行对应一个日期+一个人物的组合),这样才能和传记表关联。用pandas的melt函数就能轻松实现:
# 提取所有以People_开头的列 people_cols = [col for col in df1.columns if col.startswith('People_')] # 宽表转长表,保留Id和Date作为标识 df1_melted = df1.melt(id_vars=['Id', 'Date'], value_vars=people_cols, var_name='Person_Col', value_name='People') # 移除没有人物信息的空行 df1_melted = df1_melted.dropna(subset=['People'])
步骤4:合并两个DataFrame
现在我们可以通过People列把转换后的长表和传记表关联起来,用inner连接类型会自动过滤掉没有传记数据的人物,正好符合你不需要为所有人生成行的要求:
merged_df = pd.merge(df1_melted, df2, on='People', how='inner')
步骤5:整理成目标输出格式
最后只筛选出你需要的列(Date、Birth_state、Sex、Ethnicity),还可以按日期排序让结果更清晰:
# 选择目标列 result_df = merged_df[['Date', 'Birth_state', 'Sex', 'Ethnicity']] # 按日期排序 result_df = result_df.sort_values('Date').reset_index(drop=True)
查看最终结果
执行下面的代码就能得到和你示例一致的输出:
print(result_df.to_string(index=False))
输出结果:
Date Birth_state Sex Ethnicity Sat Aug 09 00:00:00 EDT 1969 MS Male African American Sat Dec 19 00:00:00 EST 1970 KY Female Caucasian Sat Jun 07 00:00:00 EDT 1980 TX Female Caucasian Sat Jun 07 00:00:00 EDT 1980 KY Female Caucasian Sat Dec 04 00:00:00 EST 2010 KY Female Caucasian Sat Dec 04 00:00:00 EST 2010 MO Female Caucasian Sat Dec 04 00:00:00 EST 2010 TX Female Caucasian
内容的提问来源于stack exchange,提问作者Krukiou
相关产品推荐
相关产品推荐

