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

Python 了解如何将一个数据帧的列作为行添加到另一个数据帧中,python,python-3.x,pandas,dataframe,series,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

我有以下
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
我想首先在
dfu 1
中添加一行
[0,0,0,0,0]
,并在
dfu 2['avg_days']
中添加两个
0
s,使其看起来像
[0,0,12,9.6]
,然后将其插入
dfu 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    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
最后,我想用两个
0
s填充
df_3['avg_days']
,使其看起来像
[0,0,13.5,14.5,15.5]
,然后将其插入
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
 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

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

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

结果与预期相符。

我强烈建议您阅读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)

结果与预期一致。

+1提及结构的缺失。在处理数据时,许多人不知道索引(主键)的概念。@ayorgo,是的,我认为人们从Excel(或者偶尔从NumPy)迁移到Pandas时,我们经常会看到这种情况。没有什么可以替代阅读这里的文档。我们将使用稍微不那么混乱的解决方案,但由于提到缺少结构,无法想出如何执行+1。在处理数据时,许多人不知道索引(主键)的概念。@ayorgo,是的,我认为人们从Excel(或者偶尔从NumPy)迁移到Pandas时,我们经常会看到这种情况。阅读这里的文档是无可替代的。我们打算使用一种稍微不那么凌乱的解决方案,但不知道如何做到这一点。您的
code
列应该是您的索引,这将使您的生活100%轻松。最后一步不管你的
code
栏应该是你的索引,都会让你的生活100%轻松。不管怎样,最后一步都会变得一团糟