You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:38:44