You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于标识条件拆分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()方法用来只保留对应层级的行数据,其他行设为NaN
  • ffill()(forward fill)会把最近的非NaN值向下填充,正好匹配“城市属于前面最近的州,州属于前面最近的国家”的层级关系
  • 如果你的数据里有其他特殊情况(比如州前面没有国家),可以再加个判断处理NaN值,比如用fillna()填充默认值

内容的提问来源于stack exchange,提问作者Yami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:30:53