使用pandas连接两个数据帧

时间:2016-03-04 11:59:48

标签: python pandas sum dataframe

我有两个pandas数据框,第一个有以下结构:

df1 : 

 id | age | sexe | language | country |
----|-----|------|----------|---------|
 1  | 35  | M    | FR       | FR      |
 2  | 20  | F    | EN       | EN      |
 3  | 60  | M    | IT       | IT      |

第二个具有以下结构:

df2 : 

 id | act| secs  | 
----|----|-------|
 1  | A  | 5     | 
 1  | B  | 10    | 
 1  | C  | 35    | 
 2  | A  | 1     | 
 2  | B  | 10    | 
 2  | C  | 100   | 
 2  | D  | 50    |
 3  | A  | 20    |
 3  | B  | 25    |
 3  | D  | 10    |

我想使用secs为每个用户求id,我想获取此数据框:

 id | age | sexe | language | country |secs |
----|-----|------|----------|---------|-----|     
 1  | 35  | M    | FR       | FR      | 50  |
 2  | 20  | F    | EN       | EN      | 161 |
 3  | 60  | M    | IT       | IT      | 55  |

2 个答案:

答案 0 :(得分:1)

IIUC您可以df2使用groupby sum df3 = df2.groupby('id')['secs'].sum() df4 = pd.concat([df1.set_index('id'), df3], axis=1).reset_index() In [120]: df4 Out[120]: id age sexe language country secs 0 1 35 M FR FR 50 1 2 20 F EN EN 161 2 3 60 M IT IT 55 为{C}秒'列,然后concat表示原始数据框:

pd.concat([df1.set_index('id'), df2.groupby('id')['secs'].sum()], axis=1).reset_index()

在一行中:

In [122]: %timeit pd.concat([df1.set_index('id'), df2.groupby('id')['secs'].sum()], axis=1).reset_index()
100 loops, best of 3: 2.73 ms per loop

In [123]: %timeit pd.merge(df1, df2.groupby('id')['secs'].sum().reset_index(), on=['id'])
100 loops, best of 3: 3.44 ms per loop

In [124]: %timeit pd.merge(df1, df2.groupby('id', as_index=False)['secs'].sum(), on=['id'])
100 loops, best of 3: 3.73 ms per loop

In [125]: %timeit df1.set_index('id').join(df2.groupby('id')['secs'].sum()).reset_index()
100 loops, best of 3: 2.88 ms per loop

<强>时序

var object = {
  someMethod: function(a) { console.log("hello") }
};

答案 1 :(得分:1)

您可以df1上的mergegroupbysum尝试reset_index df2

print df2.groupby('id')['secs'].sum().reset_index()
   id  secs
0   1    50
1   2   161
2   3    55

print pd.merge(df1, df2.groupby('id')['secs'].sum().reset_index(), on=['id'])
   id  age sexe language country  secs
0   1   35    M       FR      FR    50
1   2   20    F       EN      EN   161
2   3   60    M       IT      IT    55

或在groupby中使用参数as_index=False

print pd.merge(df1, df2.groupby('id', as_index=False)['secs'].sum(), on=['id'])
   id  age sexe language country  secs
0   1   35    M       FR      FR    50
1   2   20    F       EN      EN   161
2   3   60    M       IT      IT    55

或者您可以使用join

print df1.set_index('id').join(df2.groupby('id')['secs'].sum()).reset_index()
   id  age sexe language country  secs
0   1   35    M       FR      FR    50
1   2   20    F       EN      EN   161
2   3   60    M       IT      IT    55