如何以轮询方式将列表值循环分配至DataFrame新列
问题描述
我有一个名为List_A的列表:
[A,B,C,D,E,F,G]
需要将其以轮询方式循环分配至DataFrame df的新列col_new,分配需在覆盖DataFrame的行数后停止。我尝试使用groupby.cumcount()方法,但无法设置列表值分配的迭代次数限制,尝试的代码如下:
df['col_new'] = ( List_A.repeat(df['Col_1'] / len(List_A)).sort_values( key=lambda d: d.groupby(s).cumcount(), kind='stable', ignore_index=True, ) )
解决方案
不需要用groupby.cumcount(),直接基于DataFrame行数生成对应长度的轮询序列即可,以下是两种简单可行的方法:
方法一:利用numpy快速生成序列
import numpy as np # 计算列表需要重复的完整次数和剩余元素数 full_repeats = len(df) // len(List_A) remainder_count = len(df) % len(List_A) # 拼接出刚好匹配df行数的轮询序列 polling_sequence = np.tile(List_A, full_repeats).tolist() + List_A[:remainder_count] # 赋值到新列 df['col_new'] = polling_sequence
方法二:纯Python列表推导式实现
如果不想依赖numpy,直接用索引取模的方式生成序列:
# 遍历df行索引,对列表长度取模得到对应元素 df['col_new'] = [List_A[i % len(List_A)] for i in range(len(df))]
原代码问题说明
你尝试的代码逻辑存在两处问题:一是List_A.repeat()的参数不符合列表方法的要求(Python列表没有repeat方法,这是numpy数组的方法);二是未定义groupby中的s变量,且整体逻辑复杂,无法精准控制序列长度匹配df行数。上面两种方法直接围绕df行数生成对应序列,逻辑更清晰且易控制。
内容的提问来源于stack exchange,提问作者Bruce Wayne 0005
相关产品推荐
相关产品推荐

