2016-08-23 10 views
5

तो मैं एक dataframe है कि कुछ गलत जानकारी यह है कि मैं ठीक करने के लिए चाहते हैं के लिए है:अजगर पांडा GroupBy मान रीसेट किया जा रहा सूचकांक के आधार पर

import pandas as pd 
tuples_index = [(1,1990), (2,1999), (2,2002), (3,1992), (3,1994), (3,1996)] 
index = pd.MultiIndex.from_tuples(tuples_index, names=['id', 'FirstYear']) 
df = pd.DataFrame([2007, 2006, 2006, 2000, 2000, 2000], index=index, columns=['LastYear']) 


df 
Out[4]: 
       LastYear 
id FirstYear   
1 1990   2007 
2 1999   2006 
    2002   2006 
3 1992   2000 
    1994   2000 
    1996   2000 

आईडी एक व्यापार के लिए संदर्भित करता है, और इस DataFrame एक का एक छोटा सा उदाहरण टुकड़ा है बहुत बड़ा यह दिखाता है कि एक व्यवसाय कैसे चलता है। प्रत्येक रिकॉर्ड एक अद्वितीय स्थान है, और मैं वहां पहला और आखिरी साल कैप्चर करना चाहता हूं। वर्तमान 'लास्टयियर' ​​केवल एक रिकॉर्ड वाले व्यवसायों के लिए सटीक है, और एक से अधिक रिकॉर्ड के लिए व्यवसायों के नवीनतम रिकॉर्ड के लिए सटीक है। क्या df अंत में की तरह दिखना चाहिए यह है:

   LastYear 
id FirstYear   
1 1990   2007 
2 1999   2002 
    2002   2006 
3 1992   1994 
    1994   1996 
    1996   2000 

और क्या मैं इसे पाने के लिए किया था वहाँ सुपर भद्दा था:

multirecord = df.groupby(level=0).filter(lambda x: len(x) > 1) 
multirecord_grouped = multirecord.groupby(level=0) 

ls = [] 
for _, group in multirecord_grouped: 
    levels = group.index.get_level_values(level=1).tolist() + [group['LastYear'].iloc[-1]] 
    ls += levels[1:] 

multirecord['LastYear'] = pd.Series(ls, index=multirecord.index.copy()) 
final_joined = pd.concat([df.groupby(level=0).filter(lambda x: len(x) == 1),multirecord]).sort_index() 

वहाँ एक बेहतर तरीका है?

उत्तर

5
shift_year = lambda df: df.index.get_level_values('FirstYear').to_series().shift(-1) 
df.groupby(level=0).apply(shift_year) \ 
    .combine_first(df.LastYear).astype(int) \ 
    .rename('LastYear').to_frame() 

enter image description here

+0

और कौन है, लेकिन आप, यह सब सिर्फ एक लाइन के साथ किया हो सकता है? – Kartik

+0

इस बात का जिक्र करने के लिए खेद है, लेकिन डेटाफ्रेम जिस पर इसका संचालन किया जा रहा है ~ 54 मिलियन पंक्तियां है। यह कोड बहुत ही सुरुचिपूर्ण है लेकिन इसे चलाने में घंटों लगेंगे। क्या आप ऐसा कुछ भी सोच सकते हैं जो इसे तेज कर सके? – jesseWUT

संबंधित मुद्दे