熊猫如何将一个数据框的一列作为一行添加到另一数据框

时间:2018-12-13 12:48:54

标签: python python-3.x pandas dataframe series

我有以下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_1中,并用两个df_2['avg_days']填充0,使其看起来像[0, 0, 12, 9.6],然后将其插入1的{​​{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]的第二行,喜欢,

df_1

2 个答案:

答案 0 :(得分:3)

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

# 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

答案 1 :(得分:1)

我强烈建议您阅读“熊猫数据框”以及使用方式/原因 这些数据帧的索引和切片。您的问题(例如零填充) 建议您可能需要一些帮助,以考虑一下 数据框会做。如前所述,如果保持 跟踪列和索引的含义。这是一个 替代解决方案:

# 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)

结果如预期。