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

pandas如何从较短列表按组为DataFrame添加列 无行丢失无NaN值

实现方法

核心思路

先为每个分组内的行生成从0开始的连续位置索引,再通过对列表长度取模的方式循环匹配列表值,全程基于原DataFrame的行顺序生成新列,不会改动原表行数、不会产生缺失值,也能自动适配被截断的末尾分组。

完整实现代码

import pandas as pd
import numpy as np

# 原测试数据
data = {
    "group_id": [0, 0, 0, 1, 1, 1, 2, 2, 2, 3], 
    "valueA": [420, 380, 390, 500, 270, 220, 150, 400, 330, 170],
    "valueB": [50, 40, 45, 22, 20, 50, 10, 60, 90, 10]
}
df = pd.DataFrame(data)
x_list = [1, 3, 5]
y_list = [2, 4, 6]

# 1. 生成每个分组内的行位置索引,从0开始计数
df["pos_in_group"] = df.groupby("group_id").cumcount()
list_len = len(x_list)

# 2. 矢量化循环取值(数据量大时比apply效率更高)
df["x"] = np.take(x_list, df["pos_in_group"] % list_len)
df["y"] = np.take(y_list, df["pos_in_group"] % list_len)

# 3. 删除中间辅助列
df = df.drop(columns="pos_in_group")

# 打印验证结果
print(df)

运行后输出和预期完全一致:

group_id  valueA  valueB  x  y
0         0     420      50  1  2
1         0     380      40  3  4
2         0     390      45  5  6
3         1     500      22  1  2
4         1     270      20  3  4
5         1     220      50  5  6
6         2     150      10  1  2
7         2     400      60  3  4
8         2     330      90  5  6
9         3     170      10  1  2

方法特性

  • 不要求group_id连续或按顺序排列,分组标识乱序、跳号时也能正常工作
  • 自动适配截断分组:无论末尾分组剩余1行还是2行,都会从列表起始位置按顺序填充
  • 不会改动原DataFrame结构:无丢行、无新增NaN行,新列长度和原表完全对齐
  • 支持任意长度的填充列表:哪怕列表长度和单组预期行数不匹配,也能通过取模逻辑无限循环填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:09:32