如何基于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
相关产品推荐
相关产品推荐

