如何基于多列表创建/操作行和为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
相关产品推荐
相关产品推荐

