代码之家  ›  专栏  ›  技术社区  ›  Vityata

在不使用“.insert”的情况下添加列而不手动重新排序时,如何在datatable中的特定位置插入列?

  •  0
  • Vityata  · 技术社区  · 5 年前

    具有以下数据表:

    import datetime as dt
    import pandas as pd
    
    some_money = [34,42,300,450,550]
    df = pd.DataFrame({'TIME': ['2020-01', '2019-12', '2019-11', '2019-10', '2019-09'], \
                        'MONEY':some_money}) 
    
    for x in range(1,4):
        df[f'period (-{x})'] = df["MONEY"].shift(periods = -x, fill_value = 0)
    df
    

    enter image description here

    如何在创建列时将它们放置在任意位置?

    我读过 how do I insert a column at a specific column index in pandas?

    cols = df.columns.tolist()
    print(cols)
    cols = ['TIME', 'period (-1)','MONEY', 'period (-2)', 'period (-3)']
    df.reindex(columns=cols)
    

    但是,创造 cols 这个列表看起来有点像手工操作。有没有办法决定 for x in range(1,4) 循环将列放在哪里?以某种方式从代码生成下表,生成数据表:

    enter image description here

    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    使用 DataFrame.insert 对于设置到某个位置,这里总是先到,但是必要的更改顺序 range reversed :

    for x in reversed(range(1,4)):
        df.insert(1, f'period (-{x})', df["MONEY"].shift(periods = -x, fill_value = 0))
    

    或由 range(4, 1, -1) :

    for x in range(4, 1, -1):
        df.insert(1, f'period (-{x})', df["MONEY"].shift(periods = -x, fill_value = 0))
    
    print (df)
          TIME  period (-1)  period (-2)  period (-3)  MONEY
    0  2020-01           42          300          450     34
    1  2019-12          300          450          550     42
    2  2019-11          450          550            0    300
    3  2019-10          550            0            0    450
    4  2019-09            0            0            0    550
    

    如果未更改订单:

    for x in range(1,4):
        df.insert(1, f'period (-{x})', df["MONEY"].shift(periods = -x, fill_value = 0))
    
    print (df)
          TIME  period (-3)  period (-2)  period (-1)  MONEY
    0  2020-01          450          300           42     34
    1  2019-12          550          450          300     42
    2  2019-11            0          550          450    300
    3  2019-10            0            0          550    450
    4  2019-09            0            0            0    550