【问题标题】:Pandas backward fill increment by 12 monthsPandas 向后填充增加了 12 个月
【发布时间】:2018-01-26 17:14:28
【问题描述】:

我有一个包含每年课程名称的数据框。我需要找到从 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  )

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    您可以将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
    

    【讨论】:

      【解决方案2】:
      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 提醒我们transform 的一个很酷的特点
      考虑到这一点,我可以将答案更改为

      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
      

      【讨论】:

        【解决方案3】:
        >>> 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
        

        【讨论】:

        • 不错!我忘了transform 不需要索引。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 2021-12-18
        相关资源
        最近更新 更多