与熊猫的对应表

时间:2016-10-30 07:46:02

标签: python pandas merge mapping series

最近,我使用pandas来操纵带有选举数据的csv。在我的DataFrame中,我为某个区域的每个城市都有一个“赢家”列。

可以表示为:

       city         winner
0      city1        party1
1      city2        party3
2      city3        party1
3      city4        party2
4      city5        party1
...
5188   city5189     party3

这就是事情:我想创建一个名为“coulour”的新列。目标是每个城市拥有一种独特的颜色,具体取决于“赢家”的价值。

要做到这一点,我可以使用if / elif语句,但我想知道是否可以使用对应表。例如,如果我一方面拥有我的巨大DataFrame,另一方面又拥有这个小数据框:

       winner       colour
0      party1       #000
1      party2       #fff
2      party3       #c0c0c0

如果“赢家”的值在两个数据框中匹配,我是否可以使用一个pandas匹配来显示“颜色”的良好值?

我已经尝试过map()函数和get_loc(),但是效果不好。

1 个答案:

答案 0 :(得分:1)

您可以使用Series创建的df2 {/ 3}}:

print (df2.set_index('winner')['colour'])
winner
party1       #000
party2       #fff
party3    #c0c0c0
Name: colour, dtype: object

df1['new'] = df1.winner.map(df2.set_index('winner')['colour'])
print (df1)
          city  winner      new
0        city1  party1     #000
1        city2  party3  #c0c0c0
2        city3  party1     #000
3        city4  party2     #fff
4        city5  party1     #000
5188  city5189  party3  #c0c0c0

如果只有on='winner'中的公共列为DataFrame),则mapwinner的另一个解决方案可以省略:

print (pd.merge(df1,df2, how='left'))
       city  winner   colour
0     city1  party1     #000
1     city2  party3  #c0c0c0
2     city3  party1     #000
3     city4  party2     #fff
4     city5  party1     #000
5  city5189  party3  #c0c0c0