Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于模式替换某些值,并在模式中提取子字符串_Python_Regex_Pandas_Split - Fatal编程技术网

Python 基于模式替换某些值,并在模式中提取子字符串

Python 基于模式替换某些值,并在模式中提取子字符串,python,regex,pandas,split,Python,Regex,Pandas,Split,熊猫数据框带有包含各种日期的col1 col1 Q2 '20 Q1 '21 May '20 June '20 25/05/2020 Q4 '20+Q1 '21 Q2 '21+Q3 '21 Q4 '21+Q1 '22 我想替换col1中与模式匹配的某些值。对于包含带“+”的两个季度的值,我希望返回字符串中的季节加上模式中包含的第一年。我想让其他值保持原样 例如: col1 Q2 '20 Q1 '21 May '20 June '20 25/05/2020 Winter 20 S

熊猫数据框带有包含各种日期的col1

 col1
 Q2 '20
 Q1 '21
 May '20
 June '20
 25/05/2020
 Q4 '20+Q1 '21
 Q2 '21+Q3 '21
 Q4 '21+Q1 '22
我想替换
col1
中与模式匹配的某些值。对于包含带“+”的两个季度的值,我希望返回字符串中的季节加上模式中包含的第一年。我想让其他值保持原样

例如:

col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Winter 20
Summer 20
Winter 21
1) 20年第4季度+21年第1季度应为“冬季20”

2) 第二季度'21+第三季度'21应为'Summer 21'

3) 2012年第4季度+2012年第1季度应为“冬季21”

所需输出:

col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Winter 20
Summer 20
Winter 21
我尝试过几种方法,如替换、拆分、提取。但我没有解决问题。使用字典是没有帮助的,因为df很大,有很多Q4'XX+Q1'XX和Q2'XX+Q3'XX的变体

'''
col1
Q2 '20
Q1 '21
May '20
June '20
25/05/2020
Q4 '20+Q1 '21
Q2 '21+Q3 '21
Q4 '21+Q1 '22
'''

import pandas as pd

df = pd.read_clipboard(sep="!")

print(df)
输出:

           col1
0         Q2 '20
1         Q1 '21
2        May '20
3       June '20
4     25/05/2020
5  Q4 '20+Q1 '21
6  Q2 '21+Q3 '21
7  Q4 '21+Q1 '22
         col1
0      Q2 '20
1      Q1 '21
2     May '20
3    June '20
4  25/05/2020
5   Winter 20
6   Summer 21
7   Summer 21

输出:

           col1
0         Q2 '20
1         Q1 '21
2        May '20
3       June '20
4     25/05/2020
5  Q4 '20+Q1 '21
6  Q2 '21+Q3 '21
7  Q4 '21+Q1 '22
         col1
0      Q2 '20
1      Q1 '21
2     May '20
3    June '20
4  25/05/2020
5   Winter 20
6   Summer 21
7   Summer 21

您可以匹配多个图案,每个季节一个:

df=pd.DataFrame({'col1':[
“Q2'20”,
“Q1'21”,
“5月20日”,
“6月20日”,
"25/05/2020",
“20年第四季度+21年第一季度”,
“第二季度21+第三季度21”,
“21年第4季度+22年第1季度”]})
季节={
r“Q4”(\d*)\+Q1.*:r“Winter\1”,
r“Q1'(\d*)\+Q2.*:r'Spring\1',
r“Q2'(\d*)\+Q3.*:r'Summer\1',
r“Q3”(\d*)\+Q4.*:r“秋\1”
}
df.col1.replace(季节,正则表达式=True)
0 Q2'20
二零零一年第一季
20年5月2日
20年6月3日
4    25/05/2020
5冬季20
6夏季21
7冬季21
或者我认为更有效的另一个版本,因为我只匹配一个正则表达式,但我使用全局变量,所以我不确定哪个版本更好

季节={
‘Q4Q1’:‘冬季’,
‘Q1Q2’:‘春天’,
“第三季度”:夏季,
‘第四季度’:‘秋季’
}
pattern=re.compile(r“(Q\d)”(\d*)\+(Q\d)。*”)
def更换季节(世界其他地区):
匹配=模式。匹配(行)
如果匹配:
季节=季节[比赛组(1)+比赛组(3)]
年份=匹配。组(2)
回归季节+年
其他:
返回行
df.col1.apply(将季节更改为季节)

对不起-我应该说数据帧有数千行,有很多变体,因此使用dict没有帮助。在这种情况下,逻辑关联必须以您想要转换的方式存在。例如,如果有一些python库或包可以将值“Q4'20+Q1'21”转换为“Winter 20”作为通用标准。如果我能找到任何东西,我会更新我的答案。你能提供所有可能的XX映射吗。例如,Q4'XX+Q1'XX+1==冬季XX+1。第二季度XX+第三季度XX==夏季XX。第一季度XX+第二季度XX和第三季度XX+第四季度XX的情况如何?第一季度XX+第二季度XX和第三季度XX+第四季度XX在数据中不存在,也不会存在。只有第4季度XX+1季度XX和第2季度XX+3季度XXI使用正则表达式更新了答案。它现在应该对你有用。你能告诉我这是否解决了你的问题吗?如果你没有全部的4季,你可以从两个解决方案中删除你不需要的。我喜欢第一个解决方案,因为它很简单。