如何使用实际数据帧中两列中的值索引另一个数据帧,从而在实际数据框中创建列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用实际数据帧中两列中的值索引另一个数据帧,从而在实际数据框中创建列相关的知识,希望对你有一定的参考价值。
美好的一天。我有两个数据集(df1,df2)。我试图通过使用列'site_before'作为df1中的行索引和列'site'作为df1中的列索引来填充df2中的列'值'。
数据集df1:
ANA01 PHO01 ATL BAL12 BOS07
ANA01 0 0 3 3 3
PHO01 0 0 3 3 3
ATL -3 -3 0 0 0
BAL12 -3 -3 0 0 0
BOS07 -3 -3 0 0 0
“第一列是行的索引”
数据集df2:
Game_ID site_before site values
1 ANA199804010 ANA01 ANA01
3 ANA199804020 ANA01 ATL
5 ANA199804030 ANA01 BAL12
7 ANA199804040 ANA01 BOS07
9 ANA199804050 ANA01 ANA01
674 BOS199804300 BOS07 BOS07
31 ANA199805010 BOS07 ANA01
33 ANA199805020 PHO01 ANA01
35 ANA199805030 PHO01 PHO01
37 ANA199805040 PHO01 ATL
39 ANA199805050 PHO01 BAL12
我试着这样做:
df2['values'] = df1.loc[df2['site_before'], df2['site']].values
但我得到一个错误,因为ValueError:错误的项目数量通过4864,放置意味着1
我期待的结果是:
Game_ID site_before site values
1 ANA199804010 ANA01 ANA01 0
3 ANA199804020 ANA01 ATL 3
5 ANA199804030 ANA01 BAL12 3
7 ANA199804040 ANA01 BOS07 3
9 ANA199804050 ANA01 ANA01 0
674 BOS199804300 BOS07 BOS07 0
31 ANA199805010 BOS07 ANA01 -3
33 ANA199805020 PHO01 ANA01 0
35 ANA199805030 PHO01 PHO01 0
37 ANA199805040 PHO01 ATL 3
39 ANA199805050 PHO01 BAL12 3
答案
使用DataFrame.join
与MultiIndex Series
创建的新DataFrame.stack
:
df2 = df2.join(df1.stack().rename('new').rename_axis(('site_before','site')),
on=['site_before','site'])
print (df2)
Game_ID site_before site new
1 ANA199804010 ANA01 ANA01 0
3 ANA199804020 ANA01 ATL 3
5 ANA199804030 ANA01 BAL12 3
7 ANA199804040 ANA01 BOS07 3
9 ANA199804050 ANA01 ANA01 0
674 BOS199804300 BOS07 BOS07 0
31 ANA199805010 BOS07 ANA01 -3
33 ANA199805020 PHO01 ANA01 0
35 ANA199805030 PHO01 PHO01 0
37 ANA199805040 PHO01 ATL 3
39 ANA199805050 PHO01 BAL12 3
替代方案是使用DataFrame.melt
与DataFrame.merge
和左连接:
df3 = df1.rename_axis('site_before').reset_index().melt('site_before', var_name='site')
df2 = df2.merge(df3, how='left')
print (df2)
Game_ID site_before site new
0 ANA199804010 ANA01 ANA01 0
1 ANA199804020 ANA01 ATL 3
2 ANA199804030 ANA01 BAL12 3
3 ANA199804040 ANA01 BOS07 3
4 ANA199804050 ANA01 ANA01 0
5 BOS199804300 BOS07 BOS07 0
6 ANA199805010 BOS07 ANA01 -3
7 ANA199805020 PHO01 ANA01 0
8 ANA199805030 PHO01 PHO01 0
9 ANA199805040 PHO01 ATL 3
10 ANA199805050 PHO01 BAL12 3
以上是关于如何使用实际数据帧中两列中的值索引另一个数据帧,从而在实际数据框中创建列的主要内容,如果未能解决你的问题,请参考以下文章
如果 pyspark 数据帧的行基于两列的值位于另一个数据帧中,如何删除它们?