删除pandas中产生的Unnamed:xx列

博客主要讲述Python使用pd.read_csv读文件时,df中多出Unnamed:38列的问题,指出这是生成csv文件采用默认参数导致。给出两种解决方案,一是to_csv时设置index=False,或加上index=True, index_label='id';还提及用pandas处理数据产生Unnamed:0列的解决办法,测试环境为Python3.6.5和3.7。

python在使用 pd.read_csv(xxx, sep='\t' )  读文件时,

结果df中多出了一列 Unnamed:38,本来38个字段又多了一个,变成39个字段。

看起来就很烦。

第39列Unnamed:38,这是我们不想需要的数据,产生原因是我们在生成csv文件的时候,采用的是默认参数,我们可以在生成csv时候,可以使用下面参数解决这一个问题。

to_csv()时候,设置index=False。或者加上 index=True, index_label="id"

解决方案一:

pd.read_csv(path, index_col=0)

pd.to_csv(path, index=False)

 

解决方案二: (方案一对我遇到的环境 是无效的,因此我采用了方案二)

用pandas处理数据是,产生了 Unnamed:0 列,解决方案如下:

df.loc[ : , ~df.columns.str.contains("^Unnamed")]

如果不对的话就换成

newdf = df.loc[ : , ~df.columns.str.contains('Unnamed')]

 

所测试环境为 python3.6.5  python3.7

 

 

 

 

 

使用matlab工具写此代码 from pathlib import Path import re import numpy as np import pandas as pd from typing import Dict, List, Tuple, Optional %---------------------- 配置参数 ---------------------- BASE_DIR = Path("附件/附件 3")% 如果基础文件夹不同,请修改 BEFORE_DIRNAME = "姿势调整前" AFTER_DIRNAME = "姿势调整后" %时间归一化目标长度 TARGET_LEN = 200 % 选择度量方式: "mse" (时间上的平均欧氏距离) 或 "dtw" (动态时间规整) METRIC = "dtw" % 输出保存位置 OUT_DIR = Path("analysis_outputs") OUT_DIR.mkdir(parents=True, exist_ok=True) %用于解析"运动者<id>第<attempt>次"的正则表达式(支持.csv/.txt等) NAME_RE = re.compile(r"运动者(\d+)第(\d+)次", re.IGNORECASE) %---------------------- 工具函数 ---------------------- def robust_read_table(fp: Path) -> pd.DataFrame: """ 尝试读取关键点表格,支持灵活的分隔符:逗号、制表符或多个空格。 保持表头名称不变。 """ % 先尝试逗号分隔;失败则使用正则表达式分隔符 try: df = pd.read_csv(fp) if df.shape[1] <= 2: raise ValueError("使用逗号分隔时数太少,尝试正则表达式分隔符。") except Exception: df = pd.read_csv(fp, sep=r"[,\s\t]+", engine="python") %如果存在明显的未命名索引,则删除 drop_cols = [c for c in df.columns if str(c).lower().startswith("unnamed")] if drop_cols: df = df.drop(columns=drop_cols) return df def get_keypoint_columns(df: pd.DataFrame) -> List[Tuple[str, str]]: """ 基于表头模式(如"0_X"、"0_Y")返回关键点索引的(x_col, y_col)有序对。 如果表头使用例如"0-X"或"0X",可以在此扩展。 """ xy_pairs = [] %按索引收集 by_index = {} for col in df.columns: s = str(col).strip() %匹配数字后跟下划线和X/Y的模式 m = re.match(r"(\d+)[_\-]?[xX]$", s) if m: idx = int(m.group(1)) by_index.setdefault(idx, {})["x"] = s continue m = re.match(r"(\d+)[_\-]?[yY]$", s) if m: idx = int(m.group(1)) by_index.setdefault(idx, {})["y"] = s continue # 也接受"0_X"、"0_Y"的精确匹配 m = re.match(r"(\d+)_([XY])$", s) if m: idx = int(m.group(1)) axis = m.group(2).lower() by_index.setdefault(idx, {})[axis] = s continue # 按索引构建有序表 for idx in sorted(by_index.keys()): cols = by_index[idx] # 确保同时有x和y坐标 if "x" in cols and "y" in cols: xy_pairs.append((cols["x"], cols["y"])) # 如果没有找到任何关键点对,抛出错误 if not xy_pairs: raise ValueError("无法检测到类似'0_X'、'0_Y'的关键点。请检查表头。") return xy_pairs # 可以在这里继续添加其他函数,如线性重采样、空间归一化等 def linear_resample(arr: np.ndarray, target_len: int) -> np.ndarray: """ 将形状为(T, D)的数组线性重采样为(target_len, D)。 """ T, D = arr.shape if T == target_len: return arr.copy() old_idx = np.linspace(0, 1, T) new_idx = np.linspace(0, 1, target_len) out = np.empty((target_len, D), dtype=float) for d in range(D): out[:, d] = np.interp(new_idx, old_idx, arr[:, d]) return out
最新发布
09-06
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值