2017-08-15 38 views
3

我有這樣一個數據幀:從數據框中刪除重複的行,但保持一個列列表 - Python的

file: 
     | FIRST | LAST | ID | 
--------------------------- 
0  "ABC"  12 35 
1  "ABC"  14 35 
2  "AB"  15 36 

現在,我要的是:

file: 
     | FIRST | LAST | ID | 
--------------------------- 
0  "ABC" [12,14] 35 
2  "AB"  15  36 

對於這個問題,讓我們假設如果ID兩行相等,則除LAST之外的所有值也相等。

因此,將所有除最後一個值以外的值都添加到列表中。

我試着用在這個環節給出解決方案: Pandas DataFrame - Combining one column's values with same index into list

我用這個:

file = file.groupby('ID') 

file = file['Last'].unique() 

這是我得到的輸出:

ID 
35 [12, 14] 
36  [15] 
Name: Last, dtype: object 

也許,我失去了一些東西在groupby()中。

感謝提前:)

UPDATE:

我原來的數據幀有100個多列。 如果ID的兩行是相等的,那麼除了LAST之外的所有值也是相等的。

回答

1

考慮到對於一個給定的ID,只有最後兩行是不同的,只是在將groupby應用到它們時取第一個值。對於'LAST'列,使用其值或將其轉換爲唯一項目列表(如果有多個項目)。

grouping_cols = ['ID', ...] 
agg_cols = {col: 'first' for col in df if col not in grouping_cols} 
agg_cols['LAST'] = lambda x: x.unique().tolist() if len(x) > 1 else x.iat[0] 
>>> df.groupby(grouping_cols, as_index=False).agg(agg_cols) 
    ID  LAST FIRST 
0 35 [12, 14] ABC 
1 36  15 AB 
+0

這對我來說很好。謝謝 –

+0

如果我想使用多列的groupby()會怎麼樣? –

+0

請參閱上面的修改。 – Alexander

2

這是你想要的嗎?

df.groupby(['FIRST', 'ID']).LAST.apply(lambda x: x.tolist()).reset_index() 

    FIRST ID LAST 
0 AB  36 [15] 
1 ABC  35 [12, 14] 
+0

我的Dataframe有超過100列,所以當我把['First','ID']放在groupby中時,所有其他列都不會在那裏。 –

+0

在這種情況下,即使其他列也需要進行彙總,您是否也希望將它們列入列表中? – Vaishali

+0

正如我在問題中提到的那樣,如果ID的值對於兩行是相等的,那麼所有其他列值也是相等的,除了LAST。 –

相關問題