2016-10-14 9 views
5

मैं एक स्तंभ है कि एक प्रारंभिक मूल्य के साथ शुरू होता उत्पन्न करने के लिए की जरूरत है, और फिर एक समारोह है कि उस स्तंभ के पिछले मान होते हैं द्वारा उत्पन्न होता है। उदाहरण के लिएपांडा: स्वयं को संदर्भित अतीत के साथ एक कॉलम बनाने को महत्व देता

df = pd.DataFrame({'a': [1,1,5,2,7,8,16,16,16]}) 
df['b'] = 0 
df.ix[0, 'b'] = 1 
df 

    a b 
0 1 1 
1 1 0 
2 5 0 
3 2 0 
4 7 0 
5 8 0 
6 16 0 
7 16 0 
8 16 0 

अब, मैं पिछली पंक्ति के न्यूनतम और दो जोड़कर कॉलम 'बी' के बाकी हिस्सों को उत्पन्न करना चाहता हूं। एक समाधान

for i in range(1, len(df)): 
    df.ix[i, 'b'] = df.ix[i-1, :].min() + 2 

होगा वांछित आउटपुट

a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12 

में परिणामस्वरूप पांडा एक 'साफ़' तरीका यह है है? अधिमानतः एक है कि गणना vectorize हैं?

+1

मैं इस तरह से नहीं सोच सकता कि इसमें पुनरावृत्ति शामिल नहीं है। लेकिन मैं कहना है आप का उपयोग करने की जरूरत नहीं है कि '.ix []'; तुम सिर्फ 'df.b [i] = [i-1] .min() df.iloc + 2' हो सकता है। – chrisaycock

उत्तर

5

pandas में सामान्य रिकर्सिव गणनाओं को संभालने का कोई शानदार तरीका नहीं है। वहाँ कुछ चाल यह vectorize करने के लिए हो सकता है, लेकिन अगर आप निर्भरता ले जा सकते हैं, इस अपेक्षाकृत दर्दरहित और numba साथ बहुत तेजी से है।

@numba.njit 
def make_b(a): 
    b = np.zeros_like(a) 
    b[0] = 1 
    for i in range(1, len(a)): 
     b[i] = min(b[i-1], a[i-1]) + 2 

    return b 

df['b'] = make_b(df['a'].values) 

df 
Out[73]: 
    a b 
0 1 1 
1 1 3 
2 5 3 
3 2 5 
4 7 4 
5 8 6 
6 16 8 
7 16 10 
8 16 12 
संबंधित मुद्दे