【问题标题】:Remove duplicates with few columns and sum the other columns删除具有少量列的重复项并对其他列求和
【发布时间】:2017-07-22 13:40:37
【问题描述】:

以下是我的数据:

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列。

谁能帮我做这件事?

【问题讨论】:

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


    【解决方案1】:

    你需要groupbyagg

    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
    

    【讨论】:

    • 我只希望在两列中进行聚合,并在其余列中包含第一个值,其余列可能会更改,而且我的实际数据中有近 75 列,我必须给出“时间” :'first', 'junk':'first' 代表一切。有没有办法避免这种情况?
    • 是的,您可以使用列表理解。给我一秒钟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多