我有两个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 |
答案 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
上的merge
,groupby
和sum
尝试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