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

根据数据帧的值在需要的地方插入其他行

  •  3
  • Michael  · 技术社区  · 6 年前

    我有一个这样的文本文件:

    num_from    num_to   var1    var2
    1           1        20      30
    2           5        40      50
    6           7        60      70
    8           8        80      90
    

    这里的值与之间的数字相同 num_from num_to 例如 var1 40岁 var2 数字2、3、4、5等于50。

    我想将此数据读入具有 read_csv() 并将该数据帧转换为:

        num    var1    var2
    0   1      20      30
    1   2      40      50
    2   3      40      50
    3   4      40      50
    4   5      40      50
    5   6      60      70
    6   7      60      70
    7   8      80      90
    

    有没有一种方法可以用熊猫来做,或者最好是循环做?

    2 回复  |  直到 6 年前
        1
  •  4
  •   jpp    6 年前

    你可以用 pd.concat 使用生成器表达式:

    df = pd.read_csv('file.csv')  # read file into dataframe
    
    gen = (pd.DataFrame({'num': np.arange(row.num_from, row.num_to+1),
                         'var1': row.var1, 'var2': row.var2}) \
           for row in df.itertuples(index=False))
    
    res = pd.concat(gen, ignore_index=True)
    
    print(res)
    
       num  var1  var2
    0    1    20    30
    1    2    40    50
    2    3    40    50
    3    4    40    50
    4    5    40    50
    5    6    60    70
    6    7    60    70
    7    8    80    90
    
        2
  •  3
  •   jezrael    6 年前

    使用:

    #generate values between
    v = [np.arange(a,b+1) for a, b in df[['num_from', 'num_to']].values]
    #get lengths of arrays
    lens = [len(x) for x in v]
    
    from itertools import chain
    
    df = pd.DataFrame({
        #flatten arrays 
        'num' : list(chain.from_iterable(v)), 
        #repeat columns
        'var1' : df['var1'].values.repeat(lens),
        'var2' : df['var2'].values.repeat(lens)
    })
    
    print (df)
       num  var1  var2
    0    1    20    30
    1    2    40    50
    2    3    40    50
    3    4    40    50
    4    5    40    50
    5    6    60    70
    6    7    60    70
    7    8    80    90