2017-03-02 36 views
2

以下是我的數據:刪除與幾列重複,總結其他列

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

您需要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 
+0

我想合計只有兩列,並有其餘列第一值和剩餘的列可以改變和在我的實際數據中也有近75列,我必須給出'時間':'第一','垃圾':一切都是'第一'。有沒有辦法避免這種情況? – haimen

+0

是的,你可以使用列表理解。稍等片刻。 – jezrael

+0

請查看編輯答案 – jezrael