तो मैं एक 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()
वहाँ एक बेहतर तरीका है?
और कौन है, लेकिन आप, यह सब सिर्फ एक लाइन के साथ किया हो सकता है? – Kartik
इस बात का जिक्र करने के लिए खेद है, लेकिन डेटाफ्रेम जिस पर इसका संचालन किया जा रहा है ~ 54 मिलियन पंक्तियां है। यह कोड बहुत ही सुरुचिपूर्ण है लेकिन इसे चलाने में घंटों लगेंगे। क्या आप ऐसा कुछ भी सोच सकते हैं जो इसे तेज कर सके? – jesseWUT