2017-10-17 24 views
1

保持最後N個重複在給定一個數據幀大熊貓

>>> import pandas as pd 
>>> lol = [['a', 1, 1], ['b', 1, 2], ['c', 1, 4], ['c', 2, 9], ['b', 2, 10], ['x', 2, 5], ['d', 2, 3], ['e', 3, 5], ['d', 2, 10], ['a', 3, 5]] 
>>> df = pd.DataFrame(lol) 

>>> df.rename(columns={0:'value', 1:'key', 2:'something'}) 
    value key something 
0  a 1   1 
1  b 1   2 
2  c 1   4 
3  c 2   9 
4  b 2   10 
5  x 2   5 
6  d 2   3 
7  e 3   5 
8  d 2   10 
9  a 3   5 

的目標是保持最後N行的key列的唯一值。

如果N=1,我可以簡單地使用.drop_duplicates()功能,例如:

>>> df.drop_duplicates(subset='key', keep='last') 
    value key something 
2  c 1   4 
8  d 2   10 
9  a 3   5 

如何保持過去的3排爲key每一個獨特的價值?


我可以嘗試一下本作N=3

>>> from itertools import chain 
>>> unique_keys = {k:[] for k in df['key']} 
>>> for idx, row in df.iterrows(): 
...  k = row['key'] 
...  unique_keys[k].append(list(row)) 
... 
>>> 
>>> df = pd.DataFrame(list(chain(*[v[-3:] for k,v in unique_keys.items()]))) 
>>> df.rename(columns={0:'value', 1:'key', 2:'something'}) 
    value key something 
0  a 1   1 
1  b 1   2 
2  c 1   4 
3  x 2   5 
4  d 2   3 
5  d 2   10 
6  e 3   5 
7  a 3   5 

但是,必須有一個更好的辦法...

回答

3

這是你想要的嗎?

df.groupby('key').tail(3) 
Out[127]: 
    value key something 
0  a 1   1 
1  b 1   2 
2  c 1   4 
5  x 2   5 
6  d 2   3 
7  e 3   5 
8  d 2   10 
9  a 3   5 
+0

我想是這樣...讓我第一次讀到GROUPBY文檔。 – alvas

+0

嗯,我認爲是對的!只有一件事,在groupby之後是一個列表或集合的結果?因爲鍵的分組順序在這裏很重要。 – alvas

+2

精彩的回答。 +1 –

1

這是否幫助:

for k,v in df.groupby('key'): 
    print v[-2:] 

    value key something 
1  b 1   2 
2  c 1   4 
    value key something 
6  d 2   3 
8  d 2   10 
    value key something 
7  e 3   5 
9  a 3   5 
+0

我認爲@Wen的'tail(N)'解決方案雖然更清晰。 – alvas

+0

@alvas是的,我同意。 – Merlin