2017-08-18 24 views
6

Tôi có một khung dữ liệu có tên khóa học cho mỗi năm. Tôi cần phải tìm thời gian trong tháng bắt đầu từ năm 2016.Tăng số lần điền lùi sau 12 tháng

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 ) 

Làm thế nào để thêm tháng trong một cột mới bắt đầu từ cao nhất (ví dụ dưới như bfill?)

Trận chung kết dữ liệu-frame sẽ xem xét như thế này ...

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 ) 

Một số các câu trả lời không xem xét rằng có thể có nhiều khóa học. Cập nhật dữ liệu mẫu ...

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 ) 

Trả lời

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

Nice! Tôi quên về 'biến đổi 'không cần chỉ mục. – piRSquared

4

Bạn có thể sử dụng transform với arange:

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 

Tất cả tín dụng để @Alexander@jezrael để nhắc nhở chúng ta về một đặc điểm thú vị của transform
Xét rằng, tôi có thể thay đổi câu trả lời của tôi để

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 
Các vấn đề liên quan