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

如何基于多列表创建/操作行和为100的pandas DataFrame?

生成行和为100的4列整数型Pandas DataFrame

方法1:生成所有符合条件的组合

如果需要枚举所有满足要求的行(每行4个0-100的整数,和为100),可以通过三重循环遍历前3列的可能取值,计算第4列是否合法:

import pandas as pd

valid_rows = []
# 遍历第一列的所有可能值
for col1 in range(0, 101):
    # 第二列的最大值为100 - col1,避免后续和超过100
    for col2 in range(0, 101 - col1):
        # 第三列的最大值为100 - col1 - col2
        for col3 in range(0, 101 - col1 - col2):
            col4 = 100 - col1 - col2 - col3
            # 这里循环条件已确保第四列在0-100范围内,判断可省略
            valid_rows.append([col1, col2, col3, col4])

# 转换为DataFrame
df = pd.DataFrame(valid_rows, columns=['ColA', 'ColB', 'ColC', 'ColD'])

注:这种方式会生成176851行所有可能的组合,适合需要完整数据集的场景。

方法2:随机生成指定数量的符合条件的行

如果只需要随机样本,不需要全部组合,推荐两种高效方式:

方式A:基于多项式分布直接生成

利用numpy的multinomial函数,直接生成和为100的整数数组,无需校验:

import pandas as pd
import numpy as np

# 指定要生成的行数
row_count = 100
# 生成每行4个整数,和为100,概率权重均匀(可自定义权重)
random_rows = np.random.multinomial(100, [0.25]*4, size=row_count)
df = pd.DataFrame(random_rows, columns=['ColA', 'ColB', 'ColC', 'ColD'])

# 可选:验证所有行的和是否为100
assert (df.sum(axis=1) == 100).all()

方式B:循环校验生成(适合自定义逻辑)

如果需要更灵活的生成逻辑,可以通过循环生成并校验:

import pandas as pd
import numpy as np

def create_valid_row():
    while True:
        col1 = np.random.randint(0, 101)
        col2 = np.random.randint(0, 101 - col1)
        col3 = np.random.randint(0, 101 - col1 - col2)
        col4 = 100 - col1 - col2 - col3
        if 0 <= col4 <= 100:
            return [col1, col2, col3, col4]

# 生成50条有效行
row_count = 50
valid_rows = [create_valid_row() for _ in range(row_count)]
df = pd.DataFrame(valid_rows, columns=['ColA', 'ColB', 'ColC', 'ColD'])

已有数据的行和校验与筛选

如果是从已有DataFrame中筛选符合条件的行,直接用布尔索引即可:

# 筛选行和为100的行
valid_df = df[df.sum(axis=1) == 100]

内容的提问来源于stack exchange,提问作者Holothurin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 01:55:28