代码之家  ›  专栏  ›  技术社区  ›  Umar.H

在pandas中multplaying行并添加到迭代中

  •  2
  • Umar.H  · 技术社区  · 6 年前

    考虑以下数据帧,

    df = pd.DataFrame({'ID' : [1,2,3,4,5], 'Week' : ['WK1', 'WK2', 'WK3', 'WK4', 'WK5']})
    print(df)
            ID  Week
    0   1   WK1
    1   2   WK2
    2   3   WK3
    3   4   WK4
    4   5   WK5
    

    在给周数加上+1的同时循环和复制每一行,哪种方式最适合,

    所以根据前两个值,这就是我想要的结果。

       ID   Week
    0   1   WK1
    1   1   WK2
    2   1   WK3
    3   1   WK4
    4   1   WK5
    5   2   WK1
    6   2   WK2
    7   2   WK3
    8   2   WK4
    9   2   WK5
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   piRSquared    6 年前

    这是笛卡尔积。使用理解和重建你的 DataFrame

    pd.DataFrame([(i, w) for i in df.ID for w in df.Week], columns=df.columns)
    
        ID Week
    0    1  WK1
    1    1  WK2
    2    1  WK3
    3    1  WK4
    4    1  WK5
    5    2  WK1
    6    2  WK2
    7    2  WK3
    8    2  WK4
    9    2  WK5
    10   3  WK1
    11   3  WK2
    12   3  WK3
    13   3  WK4
    14   3  WK5
    15   4  WK1
    16   4  WK2
    17   4  WK3
    18   4  WK4
    19   4  WK5
    20   5  WK1
    21   5  WK2
    22   5  WK3
    23   5  WK4
    24   5  WK5
    

    等同于

    # empty list
    a = []
    
    for i in df.ID:
        for w in df.Week:
            a.append((i, w))
    
    pd.DataFrame(a, columns=df.columns)
    
        2
  •  2
  •   BENY    6 年前

    使用 unstack 具有 bfill ffill

    df.set_index('ID',append=True).Week.unstack().ffill(1).bfill(1).stack().sort_index(level=1).reset_index(level=1)
    Out[1025]: 
       ID    0
    0   1  WK1
    1   1  WK2
    2   1  WK3
    3   1  WK4
    4   1  WK5
    0   2  WK1
    1   2  WK2
    2   2  WK3
    3   2  WK4
    4   2  WK5
    0   3  WK1
    1   3  WK2
    2   3  WK3
    3   3  WK4
    4   3  WK5
    0   4  WK1
    1   4  WK2
    2   4  WK3
    3   4  WK4
    4   4  WK5
    0   5  WK1
    1   5  WK2
    2   5  WK3
    3   5  WK4
    4   5  WK5