Pandas 向后填充增量 12 个月
Pandas backward fill increment by 12 months
我有一个包含每年课程名称的数据框。我需要找到从 2016 年开始的以月为单位的持续时间。
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 )
您可以将 transform
与 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
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
感谢 @Alexander 和 @jezrael 提醒我们 [=12= 的一个很酷的特性]
考虑到这一点,我可以将答案更改为
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
>>> 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
我有一个包含每年课程名称的数据框。我需要找到从 2016 年开始的以月为单位的持续时间。
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 )
您可以将 transform
与 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
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
感谢 @Alexander 和 @jezrael 提醒我们 [=12= 的一个很酷的特性]
考虑到这一点,我可以将答案更改为
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
>>> 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