【发布时间】:2017-07-19 18:37:20
【问题描述】:
我的数据框中有一列(称为“FY”),其财政年度值的格式为:2015/2016 或 2016/2017。
我想将整列转换为 15/16 或 16/17 等。
我猜你不知何故只从字符串中取出第 3、第 4 和第 5 个字符,以及第 8 和第 9 个字符,但不知道该怎么做。
谁能帮帮我?谢谢。
【问题讨论】:
我的数据框中有一列(称为“FY”),其财政年度值的格式为:2015/2016 或 2016/2017。
我想将整列转换为 15/16 或 16/17 等。
我猜你不知何故只从字符串中取出第 3、第 4 和第 5 个字符,以及第 8 和第 9 个字符,但不知道该怎么做。
谁能帮帮我?谢谢。
【问题讨论】:
给定一个字符串date = "2015/2016",您可以执行以下操作来获取15/16:
left, right = date.split('/') 捕获两个单独的日期从字符串中删除除最后 2 个字符之外的所有字符:
new_left = left[-2:]
new_right = right[-2:]
new_date = new_left+'/'+new_right 合二为一
编辑:根据其他答案直接使用数据框的单行解决方案:
df['new'] = df['fy'].str.split('/')[0][-2:] +'/'+ df['fy'].str.split('/')[1][-2:]
这是一种更通用的方法,因为它适用于不同长度的字符串,并且只获取最后 2 个字符,防止不正确的索引导致错误并防止您对它们进行硬编码(即使您的日期可能总是有 4 个字符)每个都加上'/',至少在接下来的 8000 年内)
【讨论】:
这是使用此示例数据集的另一种方式:
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
【讨论】:
选项 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
【讨论】:
如果你有一个字符串,你总是可以通过写来选择它的一部分:
foo = 'abcdefg'
foo2 = foo[2:4]
打印 foo2
那么输出将是: 光盘
【讨论】:
试试这个
for index, rows in df.iterrows():
s = rows["FY"]
df.loc[index, "FY"] = "".join(s[2:5] + s[7:])
这里df 是数据框对象。
【讨论】:
== 而不是=