如何在DataFrame中提取某列连字符前内容生成新列?
解决方案:提取DataFrame中含连字符字符串的前缀
需求说明
需在Pandas DataFrame中新增group列:
- 若
product列的字符串包含连字符-,提取连字符之前的内容填入group - 若
product列无连字符,group列留空
原代码问题
原代码错误地使用空格" "作为分割符,而需求是基于连字符"-"分割,因此无法得到预期结果。
修正方案
提供两种简洁有效的实现方式:
方法1:使用str.split按连字符分割
import pandas as pd data = {'month': ['April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March'], 'kpi': ['D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'K sales', 'K sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales'], 'product': ['ps', 'ss', 'ks', 'ds', 'ls', 'js', 'vs', 'es', 'rs', 'os', 'Export-ps', 'Retail-is', 'Export-water', 'Retail-bottle', 'Export-salt', 'Farming-Fruits', 'Farming-Vegetables', 'Export-Tea', 'Export-water', 'Retail-bottle', 'Retail-water', 'Farming-Vegetables', 'Farming-Vegetables', 'Export-salt'], 'year': [2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023] } df = pd.DataFrame(data) # 按连字符分割,仅分割1次并展开为DataFrame split_result = df["product"].str.split("-", n=1, expand=True) # 提取分割后的第一部分,空值填充为空字符串 df["group"] = split_result[0].fillna("") # 对无连字符的行,将group列置空 df.loc[~df["product"].str.contains("-"), "group"] = "" print(df)
方法2:使用正则表达式str.extract(更简洁)
import pandas as pd data = {'month': ['April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March'], 'kpi': ['D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'D sales', 'K sales', 'K sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales', 'S sales'], 'product': ['ps', 'ss', 'ks', 'ds', 'ls', 'js', 'vs', 'es', 'rs', 'os', 'Export-ps', 'Retail-is', 'Export-water', 'Retail-bottle', 'Export-salt', 'Farming-Fruits', 'Farming-Vegetables', 'Export-Tea', 'Export-water', 'Retail-bottle', 'Retail-water', 'Farming-Vegetables', 'Farming-Vegetables', 'Export-salt'], 'year': [2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023] } df = pd.DataFrame(data) # 正则匹配连字符前的内容,无匹配时返回空字符串 df["group"] = df["product"].str.extract(r'^(.*?)-', expand=False).fillna("") print(df)
结果验证
运行上述任意代码后,group列将完全符合期望输出:无连字符的行留空,含连字符的行正确提取前缀内容。
内容的提问来源于stack exchange,提问作者Abin Benny
相关产品推荐
相关产品推荐

