![](/img/trans.png)
[英]How to add ROW of one dataframe to column of another dataframe?
[英]pandas how to add a column of one dataframe as a row into another dataframe
我有以下df_1
,
0 1 2 3
-1 201704 201705 201706
750 -1 -1 -1
760 12 0 0
我還有另外兩個DataFrames 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
S,使它看起來像[0, 0, 12, 9.6]
然后將其插入df_1
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
最后,我想用兩個0
填充df_3['avg_days']
使其看起來像[0, 0, 13.5, 14.5, 15.5]
df_1
[0, 0, 13.5, 14.5, 15.5]
,然后將其插入df_1
的第二行,看起來像這樣,
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
您的數據缺乏結構:您想要的結果沒有有意義的行和索引標簽。 因此,解決方案也很混亂:
# 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
我強烈建議您閱讀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)
結果是所需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.