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

了解如何将一个数据帧的列作为行添加到另一个数据帧中

  •  0
  • daiyue  · 技术社区  · 7 年前

    我有以下几点 df_1 ,

     0      1        2        3
    -1    201704   201705   201706
    750     -1       -1       -1
    760     12        0        0
    

    我还有两个数据帧 df_2 ,

    code    avg_days
    750       12
    760       9.6
    

    df_3 ,

    year_month    avg_days
     201704        13.5
     201705        14.5
     201706        15.5
    

    我想先添加一行 [0, 0, 0, 0, 0] 进入 和垫子 df_2['avg_days'] 有两个 0 s、 让它看起来像 [0, 0, 12, 9.6] 然后将其插入到列中 1 df_1 ,看起来像,

     0    1      2        3        4
    -1    0   201704   201705   201706
     0    0      0        0        0
    750   12    -1       -1       -1
    760   9.6   12        0        0
    

    最后,我想写一篇文章 df_3['avg_days'] 有两个 0 让它看起来像 [0, 0, 13.5, 14.5, 15.5] 然后将其作为第二行插入

     0    1      2        3        4
    -1    0   201704   201705   201706
     0    0    13.5     14.5     15.5
    750   12    -1       -1       -1
    760   9.6   12        0        0
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   jpp    7 年前

    您的数据缺乏结构:您想要的结果没有有意义的行和索引标签。因此,解决方案也很混乱:

    # merge df1 with df3
    mrg = df1.T.merge(df3.rename(columns={'year_month': 0}), how='outer')
    
    # realign column order
    mrg.columns = np.arange(mrg.shape[1])
    mrg.insert(1, 3, mrg.pop(3))
    
    # merge result with df2
    res = mrg.T.merge(df2.rename(columns={'code': 0}), how='outer')
    
    # realign column order and names
    res.insert(1, 4, res.pop('avg_days'))
    res = res.fillna(0)
    res.columns = np.arange(res.shape[1])
    
    print(res)
    
           0     1         2         3         4
    0   -1.0   0.0  201704.0  201705.0  201706.0
    1    0.0   0.0      13.5      14.5      15.5
    2  750.0  12.0      -1.0      -1.0      -1.0
    3  760.0   9.6      12.0       0.0       0.0
    
        2
  •  1
  •   nick    7 年前

    我强烈建议您阅读Pandas数据帧以及如何/为什么使用 这些数据帧的索引和切片。您的问题(例如,填充零) 建议您可能需要一些帮助来思考在 数据帧就可以了。如前所述,如果你保持 跟踪列和索引的含义。这是一个 替代解决方案:

    # your data
    df1 = pd.DataFrame({1:[201704.0,-1,12],2:[201705.0,-1,0],3:[201706.0,-1,0]}, 
    index= [-1,750,760])
    df2 = pd.DataFrame({'code': [750,760], 'avg_days':[12,9.6]})
    df3 = pd.DataFrame({'year_month':[201704.0,201705.0,201706.0],'avg_days' 
    [13.5,14.5,15.5]})
    
    # add the rows
    df1.loc[0] = np.zeros(df1.shape[1])
    
    # set the indexes in your dataframe (I set name to None as I don't know what 
    # you want)
    df2.set_index('code', inplace=True)
    df2.index.set_names([None], inplace=True)
    df2.rename(columns={'avg_days': 0}, inplace=True)
    
    # add the df2 data to df1
    result = pd.concat([df1, df2], axis=1)
    
    # again I am not sure what the columns mean in df1/result so I'll just use 
    # apply here
    month_to_avg_days_map = {k:v for k,v in df3.values}
    
    def insert_value(col):
       month_year = col.loc[-1]
       if month_year in month_to_avg_days_map:
          return month_to_avg_days_map[month_year]
       return np.nan
    
    result.loc[0,:] = result.apply(insert_value, axis=0)
    result.fillna(0, inplace=True)
    

    结果与预期一致。