如何摆脱pandas数据帧中的`Unnamed:`列

Mic*_*due 109 python csv dataframe pandas

我有一种情况,有时当我读取一个csv来自df我得到一个不需要的索引列名称unnamed:0.这很烦人!我试过了

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9
Run Code Online (Sandbox Code Playgroud)

我认为这是一个解决方案,但我仍然得到file.csv专栏!有没有人对此有所了解?

EdC*_*ica 141

它是索引列,传递index=False给不写出来,请参阅文档

例:

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
Run Code Online (Sandbox Code Playgroud)

与之比较:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

  • @CalvinKu 不幸的是,`read_csv` 没有 `skipcols` arg,在读入 csv 后你可以只做 `df = df.drop(columns=df.columns[0])` 或者你可以先读取列然后传递 cols 减去第一列,例如 `cols = pd.read_csv( ....., nrows=1).columns` 然后再次重新读取 `df = pd.read_csv(....., usecols=cols[1:])` 这避免了读取多余列然后删除它的开销 (3认同)
  • 更好的做法是在“read_csv(...,index_col=[0])”中包含方括号。还避免了[困扰整个 0.16.1 之前已弃用的 `index_col = False` 错误](https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.16.1.html)。 (3认同)
  • @MrRobot:我发布了上面的链接,告诉你原因:[`index_col = False`早在0.16.1就被弃用了](https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.16.1 .html),而 Python 无法真正区分 `bool False` 和 `int 0` 之间的区别,因此 `index_col = 0` 也已被弃用。将列表括号放在零周围:“[0]”。 (3认同)
  • 很多时候,您从其他地方获得的数据集已经包含此列,因此了解如何使用正确的参数生成“正确”的数据集并没有真正的帮助。有没有办法在它已经存在时加载它时消除它? (2认同)

cs9*_*s95 24

由于您的CSV及其CSV文件RangeIndex(通常没有名称)一起保存,因此很可能出现此问题。在保存DataFrame时,实际上需要完成此修复,但这并不总是一种选择。

避免问题:read_csv带有index_col 参数

IMO,最简单的解决方案是将未命名的列作为index读取。将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')
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

注意如果DataFrame没有索引开头,则可以
通过index=False在创建输出CSV时使用来避免这种情况。

df.to_csv('file.csv', index=False)
Run Code Online (Sandbox Code Playgroud)

但是如上所述,这并不总是一种选择。


权宜之计解决方案:使用 str.match

如果您无法修改用于读取/写入CSV文件的代码,则可以使用以下过滤条件删除该列str.match

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
Run Code Online (Sandbox Code Playgroud)

  • 多谢!“index_col=[0]”修复轻松解决了“unnamed:0”这个恼人的问题,并使代码免于冗长的重新发明轮子。 (2认同)
  • 要使用未命名列,您还可以使用正则表达式,例如`df.drop(df.filter(regex="Unname"),axis=1, inplace=True)` (2认同)

Sar*_*rah 18

要使用所有未命名的列,您还可以使用正则表达式,例如 df.drop(df.filter(regex="Unname"),axis=1, inplace=True)

  • 这对我来说非常有效,因为上面的“str.match”为我的日期格式的列名创建了“nans”。 (2认同)

Jat*_*hik 11

您可以对“未命名”列执行以下任一操作:

  1. 删除未命名的列
  2. 重命名它们(如果您想使用它们)

方法一:删除未命名列

# delete one by one like column is 'Unnamed: 0' so use it's name
df.drop('Unnamed: 0', axis=1, inplace=True)

#delete all Unnamed Columns in a single code of line using regex
df.drop(df.filter(regex="Unnamed"),axis=1, inplace=True)
Run Code Online (Sandbox Code Playgroud)

方法 2:重命名未命名的列

df.rename(columns = {'Unnamed: 0':'Name'}, inplace = True)

如果您想像输入文件一样使用空白标题写出,只需将上面的“名称”选择为“”即可。

其中OP的输入数据“file.csv”是:

,A,B,C
0,1,2,3
1,4,5,6
2,7,8,9
Run Code Online (Sandbox Code Playgroud)

#读取文件 df = pd.read_csv('file.csv')


Bre*_*dan 7

另一种可能发生的情况是,如果您的数据写入不正确csv,每行都以逗号结尾.Unnamed: x当您尝试将其读入数据时,这将在数据末尾为您留下一个未命名的列df.

  • 我用`usecols = range(0,10)`切断了未命名的列 (2认同)