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

复制DataFrame并替换值:多DataFrame关联生成目标表技术问询

嘿,我来帮你搞定这两个Pandas DataFrame的问题,分两部分给你讲明白:

1. 复制DataFrame并替换其中的值

首先要注意,复制DataFrame时一定要用df.copy()来创建深拷贝,不然修改复制后的表会不小心改动原数据。接下来给你几种常用的替换值方法:

  • 全局替换指定值:用replace()方法可以批量替换单个或多个值,非常灵活:
# 先复制原DataFrame
df_copy = df.copy()

# 替换单个值(全表所有列的"old_val"都会被替换)
df_copy = df_copy.replace("old_val", "new_val")

# 针对不同列替换不同值(字典形式)
df_copy = df_copy.replace(
    {"column1": "old1", "column2": "old2"},
    {"column1": "new1", "column2": "new2"}
)
  • 条件性替换:如果需要根据特定条件修改值,用loc定位目标行再修改:
# 比如把"score"列中小于60的值改成"不及格"
df_copy.loc[df_copy["score"] < 60, "score"] = "不及格"
  • 处理空值:要是需要替换NaN空值,用fillna()更方便:
# 给"description"列的空值填充默认文本
df_copy["description"].fillna("暂无描述", inplace=True)
2. 匹配两个DataFrame生成新表

根据你的需求,要给Df1的每个destination1匹配Df2的所有pattern,同时保留Df1的Theme、Name 1、Name 2列,分两种场景处理:

场景1:每个destination1对应Df2的所有pattern(笛卡尔积)

如果不需要任何匹配逻辑,只是让Df1的每一行和Df2的每一行做组合,用交叉连接就能轻松实现:

import pandas as pd

# 先给个示例数据方便你理解
Df1 = pd.DataFrame({
    "Theme": ["旅行", "美食"],
    "Name 1": ["Alice", "Bob"],
    "Name 2": ["Charlie", "David"],
    "destination1": ["巴黎", "东京"]
})

Df2 = pd.DataFrame({
    "pattern": ["france_*", "asia_*", "europe_*"]
})

# 交叉连接并保留需要的列
result = pd.merge(
    Df1[["Theme", "Name 1", "Name 2", "destination1"]],
    Df2[["pattern"]],
    how="cross"
)

生成的结果会是Df1的每一行对应Df2的所有pattern行,示例输出大概是这样:

ThemeName 1Name 2destination1pattern
旅行AliceCharlie巴黎france_*
旅行AliceCharlie巴黎asia_*
旅行AliceCharlie巴黎europe_*
美食BobDavid东京france_*
美食BobDavid东京asia_*
美食BobDavid东京europe_*

场景2:pattern与destination1存在匹配关系(比如正则匹配)

如果pattern是用来匹配destination1的字符串(比如france_*要匹配包含“巴黎”的行),可以用apply结合布尔索引筛选匹配的行:

def get_matched_patterns(row):
    # 这里假设pattern是正则表达式,匹配destination1的内容(可根据实际需求调整匹配逻辑)
    matched_rows = Df2[Df2["pattern"].str.match(row["destination1"].lower())]
    if not matched_rows.empty:
        # 把Df1的对应列添加到匹配结果里
        matched_rows["Theme"] = row["Theme"]
        matched_rows["Name 1"] = row["Name 1"]
        matched_rows["Name 2"] = row["Name 2"]
        matched_rows["destination1"] = row["destination1"]
        return matched_rows
    # 没有匹配结果时返回空DataFrame
    return pd.DataFrame()

# 遍历Df1的每一行,收集所有匹配结果并合并
result = pd.concat(
    [get_matched_patterns(row) for _, row in Df1.iterrows()],
    ignore_index=True
)

这样得到的结果只会保留pattern和destination1匹配成功的组合,同时保留你需要的所有列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:19:22