簡體   English   中英

熊貓如何將一個數據框的一列作為一行添加到另一數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM