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

如何基于N个数字生成特定结构的Pandas DataFrame?

如何基于N个数字生成特定结构的Pandas DataFrame?

嘿,我先帮你拆解一下这个DataFrame的规律,其实每一行的结构都是固定模式,不用摸瞎试~ 先看你给的例子,不管N是3还是4,每一行(对应Category k)都可以拆成四个部分:

  • 前导0:数量是k-1个(比如Category2就有1个0,Category3有2个0)
  • 递增累加序列:从第k个数字Ak开始,依次累加后面的数字(循环回到开头),直到把所有N个数字都加一遍,比如N=3时Category1的这部分就是A1, A1+A2, A1+A2+A3
  • 递减累加序列:去掉递增序列的第一个元素,从剩下的总和开始,依次减去前面的元素,直到只剩最后一个数字,比如N=3时Category1的这部分是A2+A3, A3
  • 后补0:数量是N-k个(比如Category1有2个0,Category2有1个0)

总列数固定是3N-2,刚好对应你给的N=3时7列、N=4时10列的情况。

接下来直接上通用代码,支持任意N,我用数值示例来演示,你可以换成自己的数字:

import pandas as pd
import numpy as np

def generate_custom_df(A):
    N = len(A)
    total_cols = 3 * N - 2
    rows = []
    
    for k in range(N):
        # 生成从Ak开始的循环序列(0-based的k对应Category k+1)
        cyclic_A = A[k:] + A[:k]
        
        # 生成递增累加序列(前缀和)
        prefix_sums = np.cumsum(cyclic_A).tolist()
        
        # 生成递减累加序列(后缀和,去掉第一个元素的后缀)
        suffix_sums = []
        for i in range(1, N):
            suffix_sums.append(sum(cyclic_A[i:]))
        
        # 前导0:k个(因为Category k+1对应k个前导0)
        leading_zeros = [0] * k
        # 后补0:N - (k+1)个
        trailing_zeros = [0] * (N - (k+1))
        
        # 拼接成一行
        row = leading_zeros + prefix_sums + suffix_sums + trailing_zeros
        rows.append(row)
    
    # 创建DataFrame,设置行和列的名称
    df = pd.DataFrame(rows, 
                      index=[f"Category {i+1}" for i in range(N)],
                      columns=[str(i+1) for i in range(total_cols)])
    return df

# 测试N=3的情况
A_3 = [1, 2, 3]  # 对应你的A1,A2,A3
df_3 = generate_custom_df(A_3)
print("N=3的结果:")
print(df_3)

# 测试N=4的情况
A_4 = [10, 20, 30, 40]  # 对应你的A1-A4
df_4 = generate_custom_df(A_4)
print("\nN=4的结果:")
print(df_4)

运行这段代码,N=3的输出会和你给的结构完全一致(数值替换了A1-A3),N=4的情况也符合你的示例。如果你想保留A1+A2这样的表达式而不是数值结果,可以把A换成字符串列表,比如A_3 = ["A1", "A2", "A3"],然后修改累加的逻辑(用字符串拼接),比如:

def generate_custom_df_str(A):
    N = len(A)
    total_cols = 3 * N - 2
    rows = []
    
    for k in range(N):
        cyclic_A = A[k:] + A[:k]
        
        # 生成字符串形式的递增累加
        prefix_exprs = []
        current = ""
        for num in cyclic_A:
            if current:
                current += "+" + num
            else:
                current = num
            prefix_exprs.append(current)
        
        # 生成字符串形式的递减累加
        suffix_exprs = []
        for i in range(1, N):
            expr = "+".join(cyclic_A[i:])
            suffix_exprs.append(expr)
        
        leading_zeros = ["0"] * k
        trailing_zeros = ["0"] * (N - (k+1))
        
        row = leading_zeros + prefix_exprs + suffix_exprs + trailing_zeros
        rows.append(row)
    
    df = pd.DataFrame(rows, 
                      index=[f"Category {i+1}" for i in range(N)],
                      columns=[str(i+1) for i in range(total_cols)])
    return df

# 测试字符串版本
A_3_str = ["A1", "A2", "A3"]
df_3_str = generate_custom_df_str(A_3_str)
print("字符串版本N=3的结果:")
print(df_3_str)

这个版本输出的就是你示例里的表达式形式啦,完全匹配你的需求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 12:43:10