Pandas DataFrame无法创建new_url列问题求助
问题解决:Pandas无法生成new_url列并导出
问题原因
你的代码里使用df.iloc[i]['new_url']这种链式索引赋值,本质是修改了DataFrame的临时副本,而非原DataFrame本身。即使打印出了正确结果,原数据里的new_url列并没有被实际更新,甚至可能因为初始时未创建该列,导致导出时完全缺失。
解决方案
方法1:修正循环赋值逻辑(推荐先初始化列)
先创建new_url列并初始化,然后用.loc直接定位行和列赋值,确保修改的是原DataFrame:
import pandas as pd import url_parser from url_parser import get_url # 读取数据 df = pd.read_csv("C:\\Users\\myuser\\Desktop\\raw_data.csv", sep=';') # 先初始化new_url列,避免列不存在的问题 df['new_url'] = '' # 循环遍历,用.loc赋值 for idx, x in enumerate(df['domain']): print("*", x, "*") if '.cdn.' in x: parsed_url = x.split('.cdn')[0] print(parsed_url) df.loc[idx, 'new_url'] = parsed_url else: url_obj = get_url(x) parsed_url = f"{url_obj.domain}.{url_obj.top_domain}" print(parsed_url) df.loc[idx, 'new_url'] = parsed_url # 导出数据(添加index=False避免导出索引列) df.to_csv("C:\\Users\\myuser\\Desktop\\cleanurl.csv", sep=';', index=False)
方法2:用apply替代循环(更符合Pandas风格)
Pandas推荐用向量化操作或apply替代显式循环,代码更简洁高效:
import pandas as pd import url_parser from url_parser import get_url df = pd.read_csv("C:\\Users\\myuser\\Desktop\\raw_data.csv", sep=';') def parse_domain(domain): if '.cdn.' in domain: return domain.split('.cdn')[0] else: url_obj = get_url(domain) return f"{url_obj.domain}.{url_obj.top_domain}" # 生成new_url列 df['new_url'] = df['domain'].apply(parse_domain) # 打印验证结果 print(df[['domain', 'new_url']]) # 导出数据 df.to_csv("C:\\Users\\myuser\\Desktop\\cleanurl.csv", sep=';', index=False)
关键说明
- 链式索引(如
df.iloc[i]['col'])会触发Pandas的SettingWithCopyWarning,这是因为它返回的是原数据的视图或副本,修改操作不保证作用在原数据上。 - 用
.loc[row_idx, col_name]是修改原DataFrame的安全方式。 apply方法更符合Pandas的设计理念,处理大数据集时比显式循环效率更高。
内容的提问来源于stack exchange,提问作者charmander
相关产品推荐
相关产品推荐

