如何实现DataFrame中多值列表到单值的映射并重复对应值
展开嵌套列表生成DataFrame的实现方法
核心思路
要实现将嵌套的Reason_lst展开,同时让对应的ID和TestDate重复匹配,本质是根据每个子列表的长度,重复对应的ID和日期值,再和展开后的Reason元素一一对应。
方法一:列表推导式(简洁直观)
先构造三个展开后的平级列表,再传入pandas生成DataFrame:
import pandas as pd # 示例数据 ID_lst = [1, 2, 3] Reason_lst = [["超时", "错误"], ["中断"], ["异常", "未响应"]] TestDate_lst = ["2024-05-01", "2024-05-02", "2024-05-03"] # 构造展开后的列表 expanded_ids = [id for id, reasons in zip(ID_lst, Reason_lst) for _ in reasons] expanded_dates = [date for date, reasons in zip(TestDate_lst, Reason_lst) for _ in reasons] expanded_reasons = [reason for reasons in Reason_lst for reason in reasons] # 生成DataFrame df = pd.DataFrame({ "ID": expanded_ids, "TestDate": expanded_dates, "Reason": expanded_reasons }) print(df)
输出结果:
ID TestDate Reason 0 1 2024-05-01 超时 1 1 2024-05-01 错误 2 2 2024-05-02 中断 3 3 2024-05-03 异常 4 3 2024-05-03 未响应
方法二:结合map函数实现(满足你的需求)
如果想用map函数,可以借助itertools.repeat来生成重复的ID和日期,再扁平化处理:
import pandas as pd import itertools # 示例数据同上 ID_lst = [1, 2, 3] Reason_lst = [["超时", "错误"], ["中断"], ["异常", "未响应"]] TestDate_lst = ["2024-05-01", "2024-05-02", "2024-05-03"] # 用map生成重复的ID迭代器 id_repeat = map(lambda x: itertools.repeat(x[0], len(x[1])), zip(ID_lst, Reason_lst)) # 扁平化迭代器得到展开的ID列表 expanded_ids = list(itertools.chain.from_iterable(id_repeat)) # 同理处理TestDate date_repeat = map(lambda x: itertools.repeat(x[0], len(x[1])), zip(TestDate_lst, Reason_lst)) expanded_dates = list(itertools.chain.from_iterable(date_repeat)) # 展开Reason列表 expanded_reasons = list(itertools.chain.from_iterable(Reason_lst)) # 生成DataFrame df = pd.DataFrame({ "ID": expanded_ids, "TestDate": expanded_dates, "Reason": expanded_reasons }) print(df)
方法三:利用pandas的explode方法(更高效)
如果先构造包含嵌套列表的DataFrame,再用explode直接展开:
import pandas as pd # 示例数据同上 ID_lst = [1, 2, 3] Reason_lst = [["超时", "错误"], ["中断"], ["异常", "未响应"]] TestDate_lst = ["2024-05-01", "2024-05-02", "2024-05-03"] # 先构造带嵌套列的DataFrame df = pd.DataFrame({ "ID": ID_lst, "TestDate": TestDate_lst, "Reason": Reason_lst }) # 展开Reason列 df = df.explode("Reason", ignore_index=True) print(df)
这种方法最简洁,pandas会自动处理ID和TestDate的重复匹配,适合大数据量场景。
内容的提问来源于stack exchange,提问作者Astro_raf
相关产品推荐
相关产品推荐

