Python列表补零及DataFrame转指定嵌套列表的技术求助
解决DataFrame转嵌套补零列表的问题
我来帮你搞定这个需求!你的目标是把给定的DataFrame转换成包含值矩阵、文本列表和年份列表的嵌套结构,缺失的年份对应值补零对吧?先分析下你现有代码的问题,再给你两种可行的解决方案。
问题分析
你之前的代码只是单独提取每个text对应的value和year,但没有和全局的年份列表做对齐,所以没法自动补零,而且每个text的value列表长度不一致,自然得不到预期的嵌套结构。我们需要先明确所有的唯一年份和文本,再逐个填充对应的值。
方案一:手动构建矩阵(适合理解底层逻辑)
这个方案一步步来,帮你理清每个环节:
import pandas as pd # 先还原你的DataFrame df = pd.DataFrame({ 'year': [2001, 2001, 2002, 2003, 2005, 2005], 'text': ['text1', 'text2', 'text2', 'text3', 'text8', 'text1'], 'value': [10, 11, 12, 56, 8, 23] }) # 1. 获取唯一的text和year,保持原数据的出现顺序 unique_texts = pd.unique(df['text']).tolist() # ['text1', 'text2', 'text3', 'text8'] unique_years = pd.unique(df['year']).tolist() # [2001, 2002, 2003, 2005] # 2. 创建年份到索引的映射,方便快速定位列位置 year_to_index = {year: idx for idx, year in enumerate(unique_years)} # 3. 初始化全零的二维矩阵,行数=唯一text数,列数=唯一year数 value_matrix = [[0] * len(unique_years) for _ in range(len(unique_texts))] # 4. 遍历每一行,填充对应位置的值 for _, row in df.iterrows(): # 找到当前text和year对应的索引 text_idx = unique_texts.index(row['text']) year_idx = year_to_index[row['year']] # 填充value value_matrix[text_idx][year_idx] = row['value'] # 5. 组合成目标嵌套列表 l1 = [value_matrix, unique_texts, unique_years] print(l1)
运行后输出:
[[[10, 0, 0, 23], [11, 12, 0, 0], [0, 0, 56, 0], [0, 0, 0, 8]], ['text1', 'text2', 'text3', 'text8'], [2001, 2002, 2003, 2005]]
注:你给出的示例中text2对应的子列表是[0,12,0,0],但原DataFrame里text2在2001年有值11,所以这里的结果是[11,12,0,0]才是符合补零逻辑的正确结果~
方案二:用pivot_table简化操作(高效推荐)
如果数据量比较大,用pandas的透视表功能会更高效,一行搞定对齐和补零:
import pandas as pd df = pd.DataFrame({ 'year': [2001, 2001, 2002, 2003, 2005, 2005], 'text': ['text1', 'text2', 'text2', 'text3', 'text8', 'text1'], 'value': [10, 11, 12, 56, 8, 23] }) # 获取唯一的text和year,保持原顺序 unique_texts = pd.unique(df['text']).tolist() unique_years = pd.unique(df['year']).tolist() # 用透视表生成对齐后的矩阵,缺失值补0 pivot_df = df.pivot_table( index='text', columns='year', values='value', fill_value=0 ) # 重新索引,确保text和year的顺序和原数据一致 pivot_df = pivot_df.reindex(index=unique_texts, columns=unique_years, fill_value=0) # 转换成列表并组合 value_matrix = pivot_df.values.tolist() l1 = [value_matrix, unique_texts, unique_years]
这个方案和方案一的结果完全一致,但代码更简洁,运行效率也更高~
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

