首页 > 解决方案 > 如何转换和组合两个 DataFrame

问题描述

我正在尝试将数据框列分配给.loc函数的行和列。我有一个df没有设置索引的 DataFrame,SitesVisits作为我的列标题

指数 地点 访问
0 101 访问 1
1 102 访问 1
2 102 访问 2

我有另一个数据框作为我的数据框索引,df2作为我的列作为我的值。SitesVisitsCost

指数 访问 1 访问 2
101 50 60
102 100 120

我正在尝试使用索引.locfromCost并将df2其添加为列df1

指数 地点 访问 成本
0 101 访问 1 50
1 102 访问 1 60
2 102 访问 2 120

我尝试使用以下代码提供行和列值

df['Cost'] = df2.loc[df['Site'],df['Visit']]

但我收到以下错误:

KeyError: "Passing list-likes to .loc or [] with any missing labels is no longer supported. 
The following labels were missing: etc. etc. 

知道如何将一个 DataFrame 中的两列值用作.loc行值和列值吗?

标签: pythonpandaspandas-loc

解决方案


  • 这是一个关于合并的问题,但是应该转换数据框,以便正确合并它们。

转换数据框

  • df2通过堆叠转换为单个列,并使用相邻列中的'Visit 1''Visit 2'
  • 从技术上讲,不需要重命名列,如下所示。但是,我认为它在创建时更容易.merge()
import pandas as pd

# create df1
df1 = pd.DataFrame({'Index': ['0', '1', '2'], 'Site': ['101', '102', '102'], 'Visit': ['Visit 1', 'Visit 1', 'Visit 2']})

# drop the Index column
df1.drop(columns=['Index'], inplace=True)

# display(df1)
  Site    Visit
0  101  Visit 1
1  102  Visit 1
2  102  Visit 2

# create df2
df2 = pd.DataFrame({'Index': ['101', '102'], 'Visit 1': ['50', '100'], 'Visit 2': ['60', '120']})

# display(df2)
  Index Visit 1 Visit 2
0   101      50      60
1   102     100     120

# stack Visit 1 and Visit 2 into a single column
df2 = df2.set_index('Index').stack().reset_index()

# rename the columns
df2.columns = ['Site', 'Visit', 'Cost']

# display(df2)
  Site    Visit Cost
0  101  Visit 1   50
1  101  Visit 2   60
2  102  Visit 1  100
3  102  Visit 2  120

合并数据框

cost = df1.merge(df2, on=['Site', 'Visit'])

# display(cost)
  Site    Visit Cost
0  101  Visit 1   50
1  102  Visit 1  100
2  102  Visit 2  120

推荐阅读