我有以下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
答案 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)
结果如预期。