基于标识条件拆分Pandas Series为多列的技术问询
完全可以实现,以下是具体解决方案
你的需求核心是根据标识(*、)识别层级,然后将上级信息向下填充到对应的城市行**,isin()方法不适用是因为它主要用来判断元素是否在某个集合里,没法处理这种层级关联和填充的逻辑。
具体实现步骤如下:
1. 构造示例数据
先模拟你的输入Series:
import pandas as pd data = pd.Series([ "*美国", "**加利福尼亚州", "洛杉矶", "旧金山", "**德克萨斯州", "休斯顿", "达拉斯", "*加拿大", "**安大略省", "多伦多", "渥太华" ])
2. 识别并提取各层级信息
先给每行打上类型标签,再提取干净的名称:
# 识别国家行(以*开头且不是**) is_region = data.str.startswith("*") & ~data.str.startswith("**") # 识别州行(以**开头) is_state = data.str.startswith("**") # 识别城市行(既不是国家也不是州) is_city = ~is_region & ~is_state # 提取干净的名称:去掉前缀的*或** df = pd.DataFrame({ "raw": data, "Region": data.where(is_region).str.replace("*", "", regex=False), "State": data.where(is_state).str.replace("**", "", regex=False), "City": data.where(is_city) })
3. 向前填充层级信息
用ffill()方法把国家和州的信息向下填充到对应的城市行:
df["Region"] = df["Region"].ffill() df["State"] = df["State"].ffill()
4. 筛选出最终的城市数据
只保留有城市的行,就是你需要的结果:
final_result = df[is_city].drop(columns=["raw"]).reset_index(drop=True) print(final_result)
运行后输出的结果就是:
Region State City 0 美国 加利福尼亚州 洛杉矶 1 美国 加利福尼亚州 旧金山 2 美国 德克萨斯州 休斯顿 3 美国 德克萨斯州 达拉斯 4 加拿大 安大略省 多伦多 5 加拿大 安大略省 渥太华
关键逻辑说明
where()方法用来只保留对应层级的行数据,其他行设为NaNffill()(forward fill)会把最近的非NaN值向下填充,正好匹配“城市属于前面最近的州,州属于前面最近的国家”的层级关系- 如果你的数据里有其他特殊情况(比如州前面没有国家),可以再加个判断处理NaN值,比如用
fillna()填充默认值
内容的提问来源于stack exchange,提问作者Yami
相关产品推荐
相关产品推荐

