基于两列重组DataFrame:按指定模式重排A、B列的实现方法
实现DataFrame的特定重组需求
嗨,我来帮你解决这个DataFrame重组的问题!先明确下你的需求:把原始那种每个A类(a/b/c)对应B列0、1、2各两次的结构,改成B列固定循环0→1→2,同时A列的元素按特定轮换顺序填充的目标结构对吧?完全可以做到,下面是具体的实现方法:
先还原你的原始数据
首先咱们先把你给出的原始DataFrame用代码定义出来,方便后续测试:
import pandas as pd # 原始DataFrame df = pd.DataFrame({ 'A': ['a']*6 + ['b']*6 + ['c']*6, 'B': [0,0,1,1,2,2]*3 })
分析目标结构的规律
观察你要的目标结果,能发现两个关键点:
- B列是0、1、2无限循环,总共18行,也就是循环6次;
- A列的元素是按
[a,b,c, b,c,a, c,a,b]这个9行的核心块重复两次组成的,刚好匹配18行的长度。
代码实现重组
基于这个规律,我们可以直接用numpy.tile来快速生成重复序列,组合成目标DataFrame:
import numpy as np # 定义A列的核心轮换模式 core_a_sequence = ['a', 'b', 'c', 'b', 'c', 'a', 'c', 'a', 'b'] # 生成完整的A列:核心块重复2次 new_A = np.tile(core_a_sequence, 2) # 生成完整的B列:0、1、2循环6次 new_B = np.tile([0, 1, 2], 6) # 组合成新的DataFrame target_df = pd.DataFrame({'A': new_A, 'B': new_B})
验证结果
运行上面的代码后,打印target_df就能得到你想要的结果:
A B 0 a 0 1 b 1 2 c 2 3 b 0 4 c 1 5 a 2 6 c 0 7 a 1 8 b 2 9 a 0 10 b 1 11 c 2 12 b 0 13 c 1 14 a 2 15 c 0 16 a 1 17 b 2
如果以后你的A类数量或者总行数有变化,也可以基于A的唯一值动态生成轮换序列,但针对你当前的固定需求,上面的方法是最直接高效的~
内容的提问来源于stack exchange,提问作者Aran
相关产品推荐
相关产品推荐

