如何摆脱从 CSV 文件读取的 pandas DataFrame 中的“未命名:0”列?

新手上路,请多包涵

我有一种情况,有时当我从 df 读取 csv 时,我得到一个不需要的类似索引的列,名为 unnamed:0

file.csv

 ,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9

CSV 是这样读取的:

 pd.read_csv('file.csv')

   Unnamed: 0  A  B  C
0           0  1  2  3
1           1  4  5  6
2           2  7  8  9

这很烦人!有谁知道如何摆脱这个?

原文由 Collective Action 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

它是索引列,传递 pd.to_csv(..., index=False) 以首先不写出未命名的索引列,请参阅 to_csv() 文档

例子:

 In [37]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
pd.read_csv(io.StringIO(df.to_csv()))

Out[37]:
   Unnamed: 0         a         b         c
0           0  0.109066 -1.112704 -0.545209
1           1  0.447114  1.525341  0.317252
2           2  0.507495  0.137863  0.886283
3           3  1.452867  1.888363  1.168101
4           4  0.901371 -0.704805  0.088335

与之比较:

 In [38]:
pd.read_csv(io.StringIO(df.to_csv(index=False)))

Out[38]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

您还可以选择通过传递 index_col=0 告诉 read_csv 第一列是索引列:

 In [40]:
pd.read_csv(io.StringIO(df.to_csv()), index_col=0)

Out[40]:
          a         b         c
0  0.109066 -1.112704 -0.545209
1  0.447114  1.525341  0.317252
2  0.507495  0.137863  0.886283
3  1.452867  1.888363  1.168101
4  0.901371 -0.704805  0.088335

原文由 EdChum 发布,翻译遵循 CC BY-SA 4.0 许可协议

这通常是由于您的 CSV 与(未命名的)索引 ( RangeIndex ) 一起保存所致。

(修复实际上需要在保存 DataFrame 时完成,但这并不总是一个选项。)

解决方法: read_csv 带有 index_col=[0] 参数

IMO,最简单的解决方案是 将未命名的列读取为 索引。指定一个 index_col=[0] 参数 pd.read_csv ,这在第一列中读取作为索引。 (注意方括号)。

 df = pd.DataFrame('x', index=range(5), columns=list('abc'))
df

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

# Save DataFrame to CSV.
df.to_csv('file.csv')

<!- ->

 pd.read_csv('file.csv')

   Unnamed: 0  a  b  c
0           0  x  x  x
1           1  x  x  x
2           2  x  x  x
3           3  x  x  x
4           4  x  x  x

# Now try this again, with the extra argument.
pd.read_csv('file.csv', index_col=[0])

   a  b  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

笔记

如果输出 CSV 是在 pandas 中创建的,如果您的 DataFrame 没有索引开头,您可以首先使用 index=False 避免这种情况:

>  df.to_csv('file.csv', index=False)
>
> ```
>
> 但如上所述,这并不总是一种选择。

* * *

### 权宜之计解决方案:过滤 `str.match`

如果您无法修改代码以读/写 CSV 文件,您可以通过使用 [**`str.match`**](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.str.match.html) **过滤来删除该列**:

df

Unnamed: 0 a b c 0 0 x x x 1 1 x x x 2 2 x x x 3 3 x x x 4 4 x x x

df.columns

Index([‘Unnamed: 0’, ‘a’, ‘b’, ‘c’], dtype=‘object’)

df.columns.str.match(‘Unnamed’)

array([ True, False, False, False])

df.loc[:, ~df.columns.str.match(‘Unnamed’)]

a b c 0 x x x 1 x x x 2 x x x 3 x x x 4 x x x

”`

原文由 cs95 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题