如何转换和合并两个 DataFrame

How to transform and combine two DataFrames

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

Index Site Visit
0 101 Visit 1
1 102 Visit 1
2 102 Visit 2

我有另一个数据框 df2Sites 作为我的数据框索引,Visits 作为我的列,Cost 作为我的值。

Index Visit 1 Visit 2
101 50 60
102 100 120

我正在尝试使用 .locdf2 中的 Cost 编制索引,并将其作为列添加到 df1 中,就像这样

Index Site Visit Cost
0 101 Visit 1 50
1 102 Visit 1 60
2 102 Visit 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 行值和列值吗?

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

转换数据帧

  • 通过将 'Visit 1''Visit 2' 堆叠成一列来转换 df2,值在相邻的列中
  • 从技术上讲,不需要像下面那样重命名列。但是,我认为创建 .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

您也可以使用 DataFrame.joindf2.stack 的索引来实现目标。

df1 = df1.set_index('Index')
df2 = df2.set_index('Index')
df_reuslt = df1.join(df2.stack().rename('Cost'),
                     on=['Site', 'Visit'])

print(df_reuslt)

#            Site    Visit  Cost
#     Index                     
#     0       101  Visit 1    50
#     1       102  Visit 1   100
#     2       102  Visit 2   120