【问题标题】:Python Pandas - Dataframe column - Convert FY in format '2015/2016' to '15/16'Python Pandas - 数据框列 - 将格式“2015/2016”的 FY 转换为“15/16”
【发布时间】:2017-07-19 18:37:20
【问题描述】:

我的数据框中有一列(称为“FY”),其财政年度值的格式为:2015/20162016/2017

我想将整列转换为 15/1616/17 等。

我猜你不知何故只从字符串中取出第 3、第 4 和第 5 个字符,以及第 8 和第 9 个字符,但不知道该怎么做。

谁能帮帮我?谢谢。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    给定一个字符串date = "2015/2016",您可以执行以下操作来获取15/16

    1. 使用left, right = date.split('/') 捕获两个单独的日期
    2. 从字符串中删除除最后 2 个字符之外的所有字符:

      new_left = left[-2:]
      new_right = right[-2:]
      
    3. 将新字符串与new_date = new_left+'/'+new_right 合二为一

    编辑:根据其他答案直接使用数据框的单行解决方案:

    df['new'] = df['fy'].str.split('/')[0][-2:] +'/'+ df['fy'].str.split('/')[1][-2:]
    

    这是一种更通用的方法,因为它适用于不同长度的字符串,并且只获取最后 2 个字符,防止不正确的索引导致错误并防止您对它们进行硬编码(即使您的日期可能总是有 4 个字符)每个都加上'/',至少在接下来的 8000 年内)

    【讨论】:

    • 非常感谢。完全按照你说的工作。我投了赞成票。我希望你不介意,但我会接受 Andrew 的回答,因为我认为它会更多地帮助其他人,因为它可以在一行中完成所有操作
    • 好的,我可以帮忙,但是如果你的字符串长度不同,这个答案将不起作用,因为索引会偏移或不正确。这种方法更通用
    • 感谢您抽出时间提供帮助。
    • 没问题@ScoutEU ;) 帮助他人总是一种乐趣。这就是SO的方式。你永远不知道什么时候一个“随机的陌生人”会让你开心。祝你编码好运
    • 谢谢。如果您没有注意到,我将您的答案标记为已接受的答案。如果你在英国附近,祝你有个愉快的夜晚。如果你更多地在美国,祝你有美好的一天!
    【解决方案2】:

    这是使用此示例数据集的另一种方式:

    df
              fy
    0  2015/2016
    1  2016/2017
    2  2017/2018
    
    df['fy_new'] = df['fy'].str[2:4] + '/' + df['fy'].str[7:9]
    df
              fy fy_new
    0  2015/2016  15/16
    1  2016/2017  16/17
    2  2017/2018  17/18
    

    【讨论】:

    • 完美。完全按照我的意愿工作! :)
    【解决方案3】:

    选项 1
    使用pd.Series.str.replace

    df.FY.str.replace('\d{2}(\d{2}/)\d{2}(\d{2})', r'\1\2')
    
    0    15/16
    1    16/17
    Name: FY, dtype: object
    

    选项 2
    使用pd.DataFrame.replace

    df.replace(dict(FY={'\d{2}(\d{2}/)\d{2}(\d{2})': r'\1\2'}), regex=True)
    
          FY
    0  15/16
    1  16/17
    

    【讨论】:

    • 这里有很多很棒的答案,非常感谢您的帮助。我已经将 Andrews 的答案标记为已接受的答案,但非常感谢您的帮助 :)
    • @ScoutEU 感谢您的评论。请记住,您选择接受的答案应该是您认为最有用的答案。但这是你的选择......很高兴我能帮上忙。
    • 好点。我会等到帖子较旧后再标记。谢谢
    【解决方案4】:

    如果你有一个字符串,你总是可以通过写来选择它的一部分:

    foo = 'abcdefg'

    foo2 = foo[2:4]

    打印 foo2

    那么输出将是: 光盘

    【讨论】:

      【解决方案5】:

      试试这个

      for index, rows in df.iterrows():
          s = rows["FY"]   
          df.loc[index, "FY"] = "".join(s[2:5] + s[7:])
      

      这里df 是数据框对象。

      【讨论】:

      • 嘿,第一次尝试你的,因为它一次完成。虽然我没有收到任何错误,但它也没有做任何事情?对于索引,time1.iterrows() 中的行: s = rows['Date FY'] time1.loc[index, 'Date FY'] == "".join(s[2:5] + s[7:] )
      • 再试一次。我更新了代码。我插入了== 而不是=
      • 完美! :D!太棒了!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2019-09-15
      • 2021-09-27
      • 1970-01-01
      • 2022-08-18
      • 2014-08-19
      • 2018-03-25
      相关资源
      最近更新 更多