删除包含少量列的重复项并将其他列相加

时间:2017-03-02 17:28:50

标签: python python-2.7 python-3.x pandas aggregate

以下是我的数据:

name    id  junk    date    time      value   value2
abc      1   1    1/1/2017  18:07:54    5       10
abc      1   2    1/1/2017  19:07:54    10      15
abc      2   3    2/1/2017  20:07:54    15      20
abc      2   4    2/1/2017  21:07:54    20      25
def      3   5    3/1/2017  22:07:54    25      30
def      3   6    3/1/2017  23:07:54    30      35
def      4   7    4/1/2017  12:07:54    35      40 
def      4   8    4/1/2017  13:07:54    40      45

我想根据三列nameiddate删除重复项,并取第一个值。我尝试了以下命令:

data.drop_duplicates(subset=['name', 'id', 'date'],keep = 'first')

我还想对这三列进行分组,并取valuevalue2列的总和,我尝试了以下列:

data[['name', 'id', 'date', 'value']].groupby(['name', 'id', 'date']).sum()
data[['name', 'id', 'date', 'value2']].groupby(['name', 'id', 'date']).sum()

现在我想加入所有三个数据框并获取列。我想应该有更好的方法来做到这一点?以下是我要找的输出:

name    id  junk    date    time      value   value2
abc      1   1    1/1/2017  18:07:54    15      25
abc      2   3    2/1/2017  20:07:54    35      45
def      3   5    3/1/2017  22:07:54    55      65
def      4   7    4/1/2017  12:07:54    75      85 

如果我想考虑删除基于nameiddate列的重复项,请取junktime列的第一个值还要添加valuevalue2列。

有人可以帮我这么做吗?

1 个答案:

答案 0 :(得分:1)

groupby需要agg

df = df.groupby(['name', 'id', 'date'])
       .agg({'value':'sum', 'value2':'sum', 'time':'first', 'junk':'first'})
       .reset_index()
print (df)
  name  id      date  value2      time  junk  value
0  abc   1  1/1/2017      25  18:07:54     1     15
1  abc   2  2/1/2017      45  20:07:54     3     35
2  def   3  3/1/2017      65  22:07:54     5     55
3  def   4  4/1/2017      85  12:07:54     7     755

动态解决方案:

g_cols = ['name','id','date']
sum_cols = ['value','value2']

#remove columns in groupby and for sum
cols = df.columns[~df.columns.isin(sum_cols + g_cols)]
print (cols)
Index(['junk', 'time'], dtype='object')

#dict comprehension for sum columns
d_sum = {col:'sum' for col in sum_cols}
#dict comprehension for first columns
d = {col:'first' for col in cols}
#add dicts together
d.update(d_sum)
print (d)
{'value2': 'sum', 'time': 'first', 'junk': 'first', 'value': 'sum'}

df = df.groupby(g_cols).agg(d).reset_index()
print (df)
 name  id      date  value2      time  junk  value
0  abc   1  1/1/2017      25  18:07:54     1     15
1  abc   2  2/1/2017      45  20:07:54     3     35
2  def   3  3/1/2017      65  22:07:54     5     55
3  def   4  4/1/2017      85  12:07:54     7     75