在行和列上连接数据帧

时间:2018-05-02 10:57:21

标签: python pandas

 df
            val      ts   user   visit_id    
id                                         
1             1       1    x          0.0  
21           21       1    z          0.0  
71           71       1    y          0.0  
2             2       2    x          0.0  
22           22       2    z          0.0  
72           72       2    y          0.0  
3             3       3    x          0.0  
23           23       3    z          0.0  
73           73       3    y          0.0  
4             4       4    x          0.0  
24           24       4    z          0.0  
74           74       4    y          0.0  
60           60      60    x          1.0  
90           90      60    z          1.0  
80           80      60    y          1.0  
91           91      61    z          1.0  
81           81      61    y          1.0  
61           61      61    x          1.0  
82           82      62    y          1.0  
92           92      62    z          1.0  
62           62      62    x          1.0  
83           83      63    y          1.0  
93           93      63    z          1.0  
63           63      63    x          1.0  
64           64      64    z          1.0  
64           64      64    x          1.0  
94           94      64    y          1.0  
160         160     150    y          2.0  
180         180     150    z          2.0  
150         150     150    x          2.0  
185         185     155    z          2.0  
155         155     155    x          2.0  
165         165     155    y          2.0  
156         156     156    y          2.0  
166         166     163    x          2.0  
186         186     183    z          2.0  

  df2
    visit_id    0.0     1.0     2.0
    user            
    x           0.0     28.0    56.0
    y           0.0     28.0    56.0
    z           0.0     28.0    56.0

如何将df2合并为df,使得df的所有行(其中user和visit_id等于user)和访问来自df2的id从df2获取相应的单元格。

例如

df.loc[(df.user == 'x') & (df.visit_id == 0), 'val']的所有行都应该得到df2

的左上角单元格的值

1 个答案:

答案 0 :(得分:0)

我认为内部联接需要首先stackmelt重新df2,然后再merge

df = df.merge(df2.stack().reset_index(name='val1'), on=['user','visit_id'], how='left')

替代:

df = df.merge(df2.reset_index().melt('user', value_name='val1'), on=['user','visit_id'])

或左联接使用MultiIndex

print (df.tail())
     val   ts user  visit_id
id                          
155  155  155    x       2.0
165  165  155    y       2.0
156  156  156   y1       2.0 <-change values of user for not match
166  166  163   x1       2.0 <-change values of user for not match
186  186  183   z1       2.0 <-change values of user for not match

#join together
df = df.join(df2.stack().rename('val'), on=['user','visit_id'], lsuffix='_')
#replace val column if match, else get values of original
df['val'] = df['val'].combine_first(df['val_'])
#remove original column val
df = df.drop('val_', axis=1)
print (df)
      ts user  visit_id    val
id                            
1      1    x       0.0    0.0
21     1    z       0.0    0.0
71     1    y       0.0    0.0
2      2    x       0.0    0.0
22     2    z       0.0    0.0
.
.
.
160  150    y       2.0   56.0
180  150    z       2.0   56.0
150  150    x       2.0   56.0
185  155    z       2.0   56.0
155  155    x       2.0   56.0
165  155    y       2.0   56.0
156  156   y1       2.0  156.0
166  163   x1       2.0  166.0
186  183   z1       2.0  186.0