如何将列表字符串值添加至DataFrame并重构符合要求的数据集
解决方案
你需要的是将原DataFrame与列表中的每个元素进行笛卡尔积合并,也就是每个列表元素对应原DataFrame的全部行。以下是几种高效实现的方法:
方法1:循环生成子DataFrame后合并(直观易理解)
import pandas as pd df = pd.DataFrame({'player_id': [298, 118, 108, 109, 168, 198, 116], 'date': ['2018-06-22', '2018-06-23', '2018-07-24', '2018-07-25', '2019-06-22', '2019-06-25', '2019-07-25'], 'score': [-2, 1, 2, 3, 7, 8, 6]}) L = ['ab','da','Ae','gf'] # 初始化空列表存储每个子DataFrame dfs = [] for name in L: # 复制原DataFrame,添加newName列并赋值当前列表元素 temp_df = df.copy() temp_df['newName'] = name dfs.append(temp_df) # 合并所有子DataFrame result = pd.concat(dfs, ignore_index=True) print(result)
方法2:利用笛卡尔积合并(更高效,适合大数据集)
通过创建一个包含列表元素的临时DataFrame,与原DataFrame做无关联列的合并,自动生成笛卡尔积:
import pandas as pd df = pd.DataFrame({'player_id': [298, 118, 108, 109, 168, 198, 116], 'date': ['2018-06-22', '2018-06-23', '2018-07-24', '2018-07-25', '2019-06-22', '2019-06-25', '2019-07-25'], 'score': [-2, 1, 2, 3, 7, 8, 6]}) L = ['ab','da','Ae','gf'] # 创建包含列表元素的临时DataFrame name_df = pd.DataFrame({'newName': L}) # 添加虚拟列用于合并(确保笛卡尔积) df['key'] = 1 name_df['key'] = 1 # 合并后删除虚拟列 result = pd.merge(df, name_df, on='key').drop('key', axis=1) print(result)
方法3:利用索引重复赋值(简洁写法)
import pandas as pd df = pd.DataFrame({'player_id': [298, 118, 108, 109, 168, 198, 116], 'date': ['2018-06-22', '2018-06-23', '2018-07-24', '2018-07-25', '2019-06-22', '2019-06-25', '2019-07-25'], 'score': [-2, 1, 2, 3, 7, 8, 6]}) L = ['ab','da','Ae','gf'] # 重复原DataFrame len(L)次,然后按顺序赋值newName result = df.loc[df.index.repeat(len(L))].reset_index(drop=True) result['newName'] = L * len(df) print(result)
以上三种方法都能得到你期望的结果,其中方法2和3在处理大型DataFrame时性能更优。
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

