遍历DataFrame列表删除首行失败,求原因及解决办法
问题原因与解决方法
嘿,我来帮你排查下代码没生效的原因~
为什么你的代码没起作用?
主要有两个核心问题:
drop方法默认不修改原DataFrame
你写的df.drop(df.index[0])只是生成了一个删除第一行后的新DataFrame,但并没有把这个结果存回原变量或者更新df_list里的元素。pandas的大部分方法默认都是返回新对象,不会直接修改原数据,除非你指定inplace=True参数。- 循环中的临时引用问题
在for df in df_list的循环里,df只是列表中每个DataFrame的临时引用。就算你对df做了修改,有时候也无法同步更新到df_list的原位置,导致修改没被保存下来。
修正后的代码方案
这里给你两种可靠的解决方式:
方案1:原地修改(使用inplace=True)
通过索引遍历列表,直接修改原列表中的DataFrame:
for i in range(len(df_list)): df = df_list[i] # 将第一行设为列名 df.columns = df.iloc[0] # 原地删除第一行,修改原DataFrame df.drop(df.index[0], inplace=True)
方案2:创建新列表(更推荐,避免副作用)
这种方式会生成新的DataFrame列表,不会影响原数据,更安全:
processed_df_list = [] for df in df_list: # 先把第一行设为列名,再删除第一行 processed_df = df.rename(columns=df.iloc[0]).drop(df.index[0]) processed_df_list.append(processed_df) # 之后直接使用processed_df_list即可
或者用enumerate直接更新原列表:
for idx, df in enumerate(df_list): df_list[idx] = df.rename(columns=df.iloc[0]).drop(df.index[0])
效果示例
以你给出的df_list[0]为例,修改后会变成:
| Hospital/Location | Specialty |
|---|---|
| Maimonides Med Ctr-NY | Maimonides Med Ctr-NY Medicine-Preliminary Anesthesiology |
| Jacobi Med Ctr/Einstein-NY | Pediatrics |
| Jacobi Med Ctr/Einstein-NY | Pediatrics |
| Temple Univ Hosp-PA | Internal Medicine |
内容的提问来源于stack exchange,提问作者gboge
相关产品推荐
相关产品推荐

