如何从数据框列中提取特定值并将它们放在另一列中?
How to extract particular values from a dataframe col and put them in another column?
我有一个由一列字符串组成的数据框。我想从一列中提取地点、日期和比赛号码。
数据框:
- S.no. FileName
- 0. Albany17NOV19sectionalRace1.csv
- 1. Albany22NOV19sectionalRace4.csv
- 2. New York1NOV19sectionalRace7.csv
- 3. Aquis Park Gold Coast27NOV19sectionalRace2.csv
所需的数据帧:
- S.no. Place Date Racenumber
- 0. Albany 17NOV19 Race1
- 1. Albany 22NOV19 Race4
- 2. New York 1NOV19 Race7
- 3. Aquis park Gold Coast 27NOV19 Race2
正则表达式函数应该可以完成这项工作:
import re
def split_string_to_groups(s: str):
temp = re.compile("([a-zA-Z\s]+)([0-9]+[a-zA-Z]+[0-9]+)(sectional)(Race[0-9]+)(\.csv)")
res = temp.match(s).groups()
return res
print(split_string_to_groups("Albany17NOV19sectionalRace1.csv"))
print(split_string_to_groups("Aquis Park Gold Coast27NOV19sectionalRace2.csv"))
输出:
('Albany', '17NOV19', 'sectional', 'Race1', '.csv')
('Aquis Park Gold Coast', '27NOV19', 'sectional', 'Race2', '.csv')
拆分为;
digit
后跟 Nondigit
和 digit
即 17NOV19
或
sectional
或
3个特殊字符.
拆分后删除所有具有 None 作为值的行和任何其他不需要的行。如果需要,可以重命名列
df=df.FileName.str.split('(\d+\D+\d+)|(sectional)|(\.)', expand=True).dropna(1).drop(columns=[4,6,11,12])
print(df)
0 1 8
0 Albany 17NOV19 Race1
1 Albany 22NOV19 Race4
2 New York 1NOV19 Race7
3 Aquis Park Gold Coast 27NOV19 Race2
不如其他答案好,但它仍然完成了工作:
extract_info = {
'Date': lambda x: x.str.findall('\d.+?\d{2}').str[0],
'Place': lambda x: x.str.findall('^.+?(?=\d)').str[0],
'Racenumber': lambda x: x.str.findall('Race\d+').str[0]}
df = df.FileName.agg(extract_info.values())
df.columns = extract_info.keys()
print(df)
Date Place Racenumber
0 17NOV19 Albany Race1
1 22NOV19 Albany Race4
2 1NOV19 New York Race7
3 27NOV19 Aquis Park Gold Coast Race2
我有一个由一列字符串组成的数据框。我想从一列中提取地点、日期和比赛号码。
数据框:
- S.no. FileName
- 0. Albany17NOV19sectionalRace1.csv
- 1. Albany22NOV19sectionalRace4.csv
- 2. New York1NOV19sectionalRace7.csv
- 3. Aquis Park Gold Coast27NOV19sectionalRace2.csv
所需的数据帧:
- S.no. Place Date Racenumber
- 0. Albany 17NOV19 Race1
- 1. Albany 22NOV19 Race4
- 2. New York 1NOV19 Race7
- 3. Aquis park Gold Coast 27NOV19 Race2
正则表达式函数应该可以完成这项工作:
import re
def split_string_to_groups(s: str):
temp = re.compile("([a-zA-Z\s]+)([0-9]+[a-zA-Z]+[0-9]+)(sectional)(Race[0-9]+)(\.csv)")
res = temp.match(s).groups()
return res
print(split_string_to_groups("Albany17NOV19sectionalRace1.csv"))
print(split_string_to_groups("Aquis Park Gold Coast27NOV19sectionalRace2.csv"))
输出:
('Albany', '17NOV19', 'sectional', 'Race1', '.csv')
('Aquis Park Gold Coast', '27NOV19', 'sectional', 'Race2', '.csv')
拆分为;
digit
后跟Nondigit
和digit
即17NOV19
或
sectional
或
3个特殊字符.
拆分后删除所有具有 None 作为值的行和任何其他不需要的行。如果需要,可以重命名列
df=df.FileName.str.split('(\d+\D+\d+)|(sectional)|(\.)', expand=True).dropna(1).drop(columns=[4,6,11,12])
print(df)
0 1 8
0 Albany 17NOV19 Race1
1 Albany 22NOV19 Race4
2 New York 1NOV19 Race7
3 Aquis Park Gold Coast 27NOV19 Race2
不如其他答案好,但它仍然完成了工作:
extract_info = {
'Date': lambda x: x.str.findall('\d.+?\d{2}').str[0],
'Place': lambda x: x.str.findall('^.+?(?=\d)').str[0],
'Racenumber': lambda x: x.str.findall('Race\d+').str[0]}
df = df.FileName.agg(extract_info.values())
df.columns = extract_info.keys()
print(df)
Date Place Racenumber
0 17NOV19 Albany Race1
1 22NOV19 Albany Race4
2 1NOV19 New York Race7
3 27NOV19 Aquis Park Gold Coast Race2