当前位置: 首页 > 知识库问答 >
问题:

熊猫read_csv在改变列数的情况下添加标题名称

孟意致
2023-03-14

我有很多csv文件,我想用Pandas(pd.read_csv)读取,但是,在一些文件的中间添加了一个没有标题的列,如以下示例:

Apples, Pears
1, 2
3, 4
5, 6, 7

如果使用pd.read_csv(example_file),将引发以下错误"ParserError:错误标记化数据。C错误:预期第4行中有2个字段,锯3"

我希望避免跳过这一行,而只是添加一个伪标题名,如Unknown1,并得到以下结果:

Apples, Pears, Unknown1  
1, 2, np.nan
3, 4, np.nan
5, 6, 7

共有3个答案

伍皓
2023-03-14

如果您事先不知道列数,您可以使用readline()预先确定所有行的最大列数,这是以丢失已知标头名称为代价的。

sep = ','                                                   # Define separator
lines = open("test.csv").readlines()                        # Open file and read lines
colcount = max([len(l.strip().split(sep)) for l in lines])  # Count separator
df = pd.read_csv("test.csv", names = range(colcount), skiprows = [0])
print df

   0  1    2
0  1  2  NaN
1  3  4  NaN
2  5  6  7.0

上面的colcount也可以应用到目前为止的所有其他答案。

编辑:注意输入文件,而不是。csv(见评论)

康锦
2023-03-14

我们可以加载csv,然后修复您的问题

import io
t="""Apples, Pears
1, 2
3, 4
5, 6, 7"""
df = pd.read_csv(io.StringIO(t), sep='\t')

yourdf=df.iloc[:,0].str.split(', ',expand=True)
s=df.columns.str.split(', ').tolist()[0]
yourdf.columns=s+['unknow'+str(x+1) for x in range(yourdf.shape[1]-len(s))]


yourdf
Out[104]: 
  Apples Pears unknow1
0      1     2    None
1      3     4    None
2      5     6       7
谢夜洛
2023-03-14

熊猫需要提前知道几何体来构建数据帧。您可以读取标题行并添加几个虚拟列名以提供列数,然后重新读取整个csv并丢弃未使用的列。

>>> import pandas as pd
>>> names = list(pd.read_csv('foo.csv', nrows=0)) + ['unknown1', 'unknown2']
>>> df=pd.read_csv('foo.csv', names=names, skiprows=1).dropna(axis='columns', how='all')
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0

如果有许多额外的列,并且您担心中间数据帧的内存占用,您可以使用csv模块扫描文件并计算最大行数。与熊猫不同,csv非常乐意发出大小不同的行。

>>> with open('foo.csv', newline='') as in_fp:
...     reader = csv.reader(in_fp)
...     header = next(reader)
...     num_cols = max(len(row) for row in reader)
... 
>>> names = header + ['unknown{}'.format(i+1) for i in range(num_cols-len(header))]
>>> df = pd.read_csv('foo.csv', names=names, skiprows=1)
>>> df
   Apples   Pears  unknown1
0       1       2       NaN
1       3       4       NaN
2       5       6       7.0
 类似资料:
  • 问题内容: 我读的使用。我想保留第一行作为数据,但是它一直在转换为列名。 我试过了,但这只是完全删除了它。 (请注意输入数据:我有一个字符串(),我将其转换为类似文件的对象(),然后从该文件对象进行构建。) 问题答案: 您希望将gets类型提升为查看文档重点类别: header:int或int列表,默认“ infer”行号(用作列名)以及数据的开头。如果未传递任何名称,则默认行为就像设置为0,否则

  • 我知道我可以给单只熊猫重新命名。DataFrame列具有: 但是我想在不知道列名称的情况下重命名它(基于它的索引-尽管我知道字典没有)。我想重命名第1列,如下所示: 但是在DataFrame.columns dict中没有“1”条目,因此不进行重命名。我怎样才能做到这一点?

  • 我正在读取一个包含多个datetime列的csv文件。我需要在读取文件时设置数据类型,但datetimes似乎是个问题。例如: 运行时出现错误: 不理解数据类型"datetime" 通过pandas在事实之后转换列。to_datetime()不是一个选项,我不知道哪些列将成为datetime对象。这些信息可以更改,并且来自于通知我的数据类型列表的任何信息。 或者,我尝试用numpy.genfrom

  • 如何在python熊猫中获得索引列名称?下面是一个示例数据框: 我想做的是获取/设置数据框索引标题。这是我所尝试的: 有人知道怎么做吗?

  • 问题内容: 我将Python 3.4与IPython结合使用,并具有以下代码。我无法从给定的URL读取csv文件: 我有以下错误 “预期的文件路径名或类似文件的对象,得到了类型” 我怎样才能解决这个问题? 问题答案: 更新资料 现在,您可以从熊猫直接传递URL。 正如错误所暗示的,需要一个类似文件的对象作为第一个参数。 如果要从字符串读取csv,可以使用(Python 3.x)或(Python 2

  • 我正在与以下df合作: 我想强制所有年份的数字: 有没有一个简单的方法来做这件事,还是我必须把它们全部打印出来?