2017-08-18 19 views
6

मेरे पास प्रत्येक वर्ष के लिए पाठ्यक्रम नाम के साथ डेटाफ्रेम है। मैं महीनों में अवधि वर्ष से शुरू 2016.पांडस पिछड़े 12 महीनों तक बढ़ने

from io import StringIO 

import pandas as pd 

u_cols = ['page_id','web_id'] 
audit_trail = StringIO(''' 
year_id | web_id 
2012|efg 
2013|abc 
2014| xyz 
2015| pqr 
2016| mnp 
''') 

df11 = pd.read_csv(audit_trail, sep="|", names = u_cols ) 

मैं कैसे उच्चतम से शुरू एक नया स्तंभ में महीने जोड़ सकता हूँ खोजने की जरूरत है (यानी bfill की तरह नीचे?)

अंतिम डेटा फ्रेम दिखेगा इस तरह ...

u_cols = ['page_id','web_id' , 'months'] 
audit_trail = StringIO(''' 
year_id | web_id | months 
2012|efg | 60 
2013|abc | 48 
2014| xyz | 36 
2015| pqr | 24 
2016| mnp | 12 
''') 

df12 = pd.read_csv(audit_trail, sep="|", names = u_cols ) 

जवाब में से कुछ पर विचार नहीं करते वहाँ कई पाठ्यक्रमों हो सकता है। नमूना डेटा अपडेट कर रहा है ...

from io import StringIO 

import pandas as pd 

u_cols = ['course_name','page_id','web_id'] 
audit_trail = StringIO(''' 
course_name| year_id | web_id 
a|2012|efg 
a|2013|abc 
a|2014| xyz 
a|2015| pqr 
a|2016| mnp 
b|2014| xyz 
b|2015| pqr 
b|2016| mnp 

''') 

df11 = pd.read_csv(audit_trail, sep="|", names = u_cols ) 

उत्तर

5
>>> df11.assign(months=df11.groupby('course_name').year_id.transform(
     lambda years: range(len(years) * 12, 0, -12))) 
    course_name year_id web_id months 
0   a  2012 efg  60 
1   a  2013 abc  48 
2   a  2014 xyz  36 
3   a  2015 pqr  24 
4   a  2016 mnp  12 
5   b  2014 xyz  36 
6   b  2015 pqr  24 
7   b  2016 mnp  12 
+0

अच्छा करने के लिए अपने जवाब बदल सकते हैं! मैं सूचकांक की आवश्यकता नहीं 'ट्रांसफॉर्म' के बारे में भूल गया। – piRSquared

4

आप उपयोग कर सकते हैं transformarange साथ:

df11['months'] = df11.groupby('course_name')['year_id'] \ 
        .transform(lambda x: np.arange(len(x)*12, 0, -12)) 
print (df11) 
    course_name year_id web_id months 
0   a  2012  efg  60 
1   a  2013  abc  48 
2   a  2014  xyz  36 
3   a  2015  pqr  24 
4   a  2016  mnp  12 
5   b  2014  xyz  36 
6   b  2015  pqr  24 
7   b  2016  mnp  12 
7
df11.assign(
    months=df11.groupby('course_name').apply(
     lambda x: pd.Series(np.repeat([12], len(x)).cumsum()[::-1]) 
    ).values 
) 

    course_name year_id web_id months 
0   a  2012 efg  60 
1   a  2013 abc  48 
2   a  2014 xyz  36 
3   a  2015 pqr  24 
4   a  2016 mnp  12 
5   b  2014 xyz  36 
6   b  2015 pqr  24 
7   b  2016 mnp  12 

की हमें याद दिलाता के लिए और @jezrael @Alexander करने के लिए सभी क्रेडिटकी एक अच्छी विशेषता कि ध्यान में रखते हुए, मैं

df11.assign(months=df11.groupby('course_name').year_id.transform(
    lambda x: np.repeat([12], len(x)).cumsum()[::-1] 
)) 

    course_name year_id web_id months 
0   a  2012 efg  60 
1   a  2013 abc  48 
2   a  2014 xyz  36 
3   a  2015 pqr  24 
4   a  2016 mnp  12 
5   b  2014 xyz  36 
6   b  2015 pqr  24 
7   b  2016 mnp  12