आप groupby/tail(2)
पिछले 2 आइटम लेने के लिए सकता है, तो groupby/head(1)
से पहले आइटम लेने के लिए पूंछ:
df.groupby(['A','B']).tail(2).groupby(['A','B']).head(1)
यदि केवल एक ही है समूह में आइटम, tail(2)
केवल एक आइटम देता है।
उदाहरण के लिए,
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(10, size=(10**2, 3)), columns=list('ABC'))
result = df.groupby(['A','B']).tail(2).groupby(['A','B']).head(1)
expected = (df.groupby(['A', 'B'], as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[-2]]).reset_index(level=0, drop=True))
assert expected.sort_index().equals(result)
builtin GroupBy तरीकों (जैसे tail
और head
के रूप में) अक्सर से कस्टम पायथन कार्यों के साथ groupby/apply
बहुत तेजी से कर रहे हैं। यह विशेष रूप से सच है अगर वहाँ समूहों के एक बहुत हैं:
In [96]: %timeit df.groupby(['A','B']).tail(2).groupby(['A','B']).head(1)
1000 loops, best of 3: 1.7 ms per loop
In [97]: %timeit (df.groupby(['A', 'B'], as_index=False).apply(lambda x: x if len(x)==1 else x.iloc[[-2]]).reset_index(level=0, drop=True))
100 loops, best of 3: 17.9 ms per loop
वैकल्पिक रूप से, ayhan suggests एक अच्छा सुधार:
alt = df.groupby(['A','B']).tail(2).drop_duplicates(['A','B'])
assert expected.sort_index().equals(alt)
In [99]: %timeit df.groupby(['A','B']).tail(2).drop_duplicates(['A','B'])
1000 loops, best of 3: 1.43 ms per loop
क्या तरह की पहचान स्तंभ डेटा है? – SO44
सारित प्रश्न: यदि डुप्लिकेट वास्तविक डुप्लिकेट हैं, तो आखिरी मामले में दूसरा क्यों होगा, अन्यथा वे डुप्लिकेट नहीं हैं। – Merlin
@ मार्लिन मेरी समझ यह है कि '[व्यक्ति, प्रश्न]' डुप्लीकेट की पहचान करते समय केवल कॉलम पांडा विचार करेंगे, इसलिए शेष बचे हुए कॉलम में विशिष्ट मान हो सकते हैं। –