如何匹配等长嵌套列表并关联ID转换为Pandas DataFrame
问题描述
现有两个嵌套列表Reason_lst和TestDate_lst,二者对应位置的子列表元素数量完全一致,另有一个ID列表。需要将三者匹配,让每个Reason对应同位置的TestDate,同时关联对应的ID,生成指定格式的DataFrame。
尝试用.explode方法处理时,出现了Reason和TestDate不匹配的问题,寻求解决办法。
预期输出示例:
IDs Reason TestDate 1234 Too Cool 2022-03-24 1234 Too Sad 2022-03-24 1234 Too Scared 2022-03-24 1235 Too Scary 2022-07-05 1236 Too Wonderful 2016-08-26
示例数据:
TestDate_lst = [['2022-03-24', '2022-03-24', '2022-03-24'], ['2022-07-05'], ['2016-08-26'], ['2016-05-06'], ['2020-09-29', '2020-04-14'], ['2016-07-25', '2021-12-29'], ['2020-01-03'], ['2022-07-13', '2022-07-13', '2022-07-13', '2022-07-13', '2022-07-13', '2022-07-13'], ['2019-07-23'], ....] Reason_lst = [['Too cool', 'Too sad', 'Too scared'], ['Too scary'], ['Too mean'], ['Too sarcastic'], ['Too happy'], ['Too angry'], ['Too loud'], ['Too upset', 'Too crazy', 'Too insane', 'Too free', 'Too fake'], ['Too loud'], ....] IDs = ['1234', '1235', '1236', '1237', .....]
解决方案
单独对Reason和TestDate列使用explode会导致匹配错位,因为explode是独立处理每一列的展开逻辑。要确保Reason和TestDate严格对应,可采用以下两种方法:
方法一:多列同步explode
直接构造原始DataFrame后,同时对Reason和TestDate列执行explode操作,Pandas会保证同一行的子列表同步展开:
import pandas as pd # 构造初始DataFrame df = pd.DataFrame({ 'IDs': IDs, 'Reason': Reason_lst, 'TestDate': TestDate_lst }) # 同步展开目标列,重置索引 result_df = df.explode(['Reason', 'TestDate'], ignore_index=True) # 输出结果 print(result_df)
方法二:手动构造扁平化数据
如果对explode的同步逻辑存疑,可手动遍历三个列表,直接生成扁平化的记录列表,再转为DataFrame:
import pandas as pd flat_records = [] for idx, id_val in enumerate(IDs): # 获取当前ID对应的Reason和TestDate子列表 current_reasons = Reason_lst[idx] current_dates = TestDate_lst[idx] # 配对每个Reason和对应位置的TestDate for reason, date in zip(current_reasons, current_dates): flat_records.append({ 'IDs': id_val, 'Reason': reason, 'TestDate': date }) # 转为DataFrame result_df = pd.DataFrame(flat_records) print(result_df)
两种方法都能保证Reason与TestDate严格对应,不会出现错位问题。
内容的提问来源于stack exchange,提问作者Astro_raf
相关产品推荐
相关产品推荐

