如何转换和合并两个 DataFrame
How to transform and combine two DataFrames
我正在尝试将数据框列分配给 .loc
函数的行和列。我有一个没有设置索引的 DataFrame df
,Sites
和 Visits
作为我的列 headers
Index
Site
Visit
0
101
Visit 1
1
102
Visit 1
2
102
Visit 2
我有另一个数据框 df2
,Sites
作为我的数据框索引,Visits
作为我的列,Cost
作为我的值。
Index
Visit 1
Visit 2
101
50
60
102
100
120
我正在尝试使用 .loc
为 df2
中的 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.join
和 df2.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
我正在尝试将数据框列分配给 .loc
函数的行和列。我有一个没有设置索引的 DataFrame df
,Sites
和 Visits
作为我的列 headers
Index | Site | Visit |
---|---|---|
0 | 101 | Visit 1 |
1 | 102 | Visit 1 |
2 | 102 | Visit 2 |
我有另一个数据框 df2
,Sites
作为我的数据框索引,Visits
作为我的列,Cost
作为我的值。
Index | Visit 1 | Visit 2 |
---|---|---|
101 | 50 | 60 |
102 | 100 | 120 |
我正在尝试使用 .loc
为 df2
中的 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.join
和 df2.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