在第二个数据帧中的值上加入两个数据帧

时间:2016-10-13 03:42:53

标签: python python-3.x pandas join dataframe

我正在尝试从数据集中的值加入两个数据帧:

df1     t0      t1      text0   text1
ID                                  
2133    7.0     3.0     NaN     NaN
1234    10.0    8.0     NaN     NaN
7352    9.0     7.0     NaN     NaN
2500    7.0     6.0     NaN     NaN
3298    10.0    8.0     NaN     NaN

df1(见上文)

df2     score   text_org
ID                                  
2133    7.0     asdf
2500    7.0     cccc
3298    8.0     ytyt  
2133    3.0     qwer
1234    10.0    pois
7352    9.0     ijsd
7352    7.0     bdcs
3298    10.0    swed
1234    8.0     zzzz
2500    6.0     erer

和df2(见上文)

我正在尝试将两个数据帧组合在一起,以便df1中的NaN替换为df2中的text_org。如您所见,我们通过将ID与t0或t1的分数进行匹配来获取文本。理想情况下,它看起来像这样:

 df1     t0     t1      text0   text1
ID                                  
2133    7.0     3.0     asdf    qwer
1234    10.0    8.0     pois    zzzz
7352    9.0     7.0     ijsd    bdcs
2500    7.0     6.0     cccc    erer
3298    10.0    8.0     swed    ytyt

我试图使用pd.merge - 加入,但我还没到任何地方。谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您可以先使用meltdrop个空列text0text1进行重新整形:

df = pd.melt(df1.drop(['text0','text1'], axis=1), id_vars='ID', value_name='score')
print (df)
     ID variable  score
0  2133       t0    7.0
1  1234       t0   10.0
2  7352       t0    9.0
3  2500       t0    7.0
4  3298       t0   10.0
5  2133       t1    3.0
6  1234       t1    8.0
7  7352       t1    7.0
8  2500       t1    6.0
9  3298       t1    8.0

然后merge通过内部联接(参数how='inner'默认情况下,因此省略)并且省略on=['ID','score']因为在DataFrames中只有{2}常见列:

df = pd.merge(df2, df)
print (df)
     ID  score text_org variable
0  2133    7.0     asdf       t0
1  2500    7.0     cccc       t0
2  3298    8.0     ytyt       t1
3  2133    3.0     qwer       t1
4  1234   10.0     pois       t0
5  7352    9.0     ijsd       t0
6  7352    7.0     bdcs       t1
7  3298   10.0     swed       t0
8  1234    8.0     zzzz       t1
9  2500    6.0     erer       t1

最后一次重新整形unstack并按df1设置列名,而不是第一列([1:]):

df = df.set_index(['ID','variable']).unstack()
df.columns = df1.columns[1:]
print (df)
        t0   t1 text0 text1
ID                         
1234  10.0  8.0  pois  zzzz
2133   7.0  3.0  asdf  qwer
2500   7.0  6.0  cccc  erer
3298  10.0  8.0  swed  ytyt
7352   9.0  7.0  ijsd  bdcs

通过评论编辑:

你得到:

  

ValueError:索引包含重复的条目,无法重塑

问题是df2列是否与ID列和score列重复。

e.g。新行添加到结尾,它与第一行IDscore具有相同的21337.0 - 所以请重复:

print (df2)
      ID  score text_org
0   2133    7.0     asdf
1   2500    7.0     cccc
2   3298    8.0     ytyt
3   2133    3.0     qwer
4   1234   10.0     pois
5   7352    9.0     ijsd
6   7352    7.0     bdcs
7   3298   10.0     swed
8   1234    8.0     zzzz
9   2500    6.0     erer
10  2133    7.0  new_val

合并后,您可以查看第一列和第二列 - 对于ID score asdf,您获得2个值 - new_valdf = pd.merge(df2, df) print (df) ID score text_org variable 0 2133 7.0 asdf t0 1 2133 7.0 new_val t0 2 2500 7.0 cccc t0 3 3298 8.0 ytyt t1 4 2133 3.0 qwer t1 5 1234 10.0 pois t0 6 7352 9.0 ijsd t0 7 7352 7.0 bdcs t1 8 3298 10.0 swed t0 9 1234 8.0 zzzz t1 10 2500 6.0 erer t1 ,因此会收到错误:

df2

解决方案pivot_table具有一些聚合功能或删除#aggregate function is first df3 = df.pivot_table(index='ID', columns='variable', aggfunc='first') df3.columns = df1.columns[1:] print (df3) t0 t1 text0 text1 ID 1234 10 8 pois zzzz 2133 7 3 asdf qwer 2500 7 6 cccc erer 3298 10 8 swed ytyt 7352 9 7 ijsd bdcs #aggregate function is last df4 = df.pivot_table(index='ID', columns='variable', aggfunc='last') df4.columns = df1.columns[1:] print (df4) t0 t1 text0 text1 ID 1234 10 8 pois zzzz 2133 7 3 new_val qwer 2500 7 6 cccc erer 3298 10 8 swed ytyt 7352 9 7 ijsd bdcs 中的重复项(例如使用drop_duplicates):

for (Song songObj : Song.returnSongs()) {
    totalSongCost += Double.parseDouble(songObj.getPrice());
    totalSongRating += Integer.parseInt(songObj.getRating());
}