【发布时间】:2016-08-20 13:35:07
【问题描述】:
我遇到了一个仅在将 pandas 更新到 >= 0.18 后才开始发生的错误
我有一段代码可以打开多个 csv 文件并将它们连接到一个多索引数据帧中。作为 pd.concat 步骤的一部分,我使用names=['Sweep', 'Index'] 设置索引名称。在从 0.17 更新到 0.18 之前,这工作正常,但自从更新后,我得到了下面显示的回溯。
我已将问题减少到能够通过此重现(示例 csv 可以在 here 找到):
filename = './example.csv'
df = pd.read_csv(filename)
pd.concat([df, ], keys=['Sweep1', ], names=['Sweep', 'Index'])
这会导致以下回溯:
Traceback (most recent call last):
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\range.py", line 124, in _simple_new
return RangeIndex(start, stop, step, name=name, **kwargs)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\range.py", line 73, in __new__
start = _ensure_int(start, 'start')
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\range.py", line 59, in _ensure_int
new_value = int(value)
TypeError: only length-1 arrays can be converted to Python scalars
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\base.py", line 63, in __repr__
return str(self)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\base.py", line 42, in __str__
return self.__unicode__()
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\frame.py", line 534, in __unicode__
line_width=width, show_dimensions=show_dimensions)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1486, in to_string
show_dimensions=show_dimensions)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\format.py", line 378, in __init__
self._chk_truncate()
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\core\format.py", line 450, in _chk_truncate
frame.iloc[-row_num:, :]))
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\tools\merge.py", line 834, in concat
copy=copy)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\tools\merge.py", line 972, in __init__
self.new_axes = self._get_new_axes()
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\tools\merge.py", line 1059, in _get_new_axes
new_axes[self.axis] = self._get_concat_axis()
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\tools\merge.py", line 1111, in _get_concat_axis
concat_axis = _concat_indexes(indexes)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\tools\merge.py", line 1129, in _concat_indexes
return indexes[0].append(indexes[1:])
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\multi.py", line 1029, in append
label = self.get_level_values(i)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\multi.py", line 666, in get_level_values
tz=getattr(unique, 'tz', None))
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\range.py", line 126, in _simple_new
return Index(start, stop, step, name=name, **kwargs)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\base.py", line 214, in __new__
return Int64Index(data, copy=copy, dtype=dtype, name=name)
File "C:\Users\User\Anaconda3\lib\site-packages\pandas\indexes\numeric.py", line 107, in __new__
not issubclass(np.dtype(dtype).type, np.integer)):
TypeError: data type "Index" not understood
我已经在几台不同的机器上尝试过这个(认为可能是 anaconda 的问题),但我到处都遇到了这个问题。
如果我只是生成一个虚拟数据框并执行相同的操作,则不会发生这种情况。即:
df = pd.DataFrame({"Vals1": range(8), "Vals2": range(8)})
pd.concat([df, ], keys=['Sweep1', ], names=['Sweep', 'Index'])
工作正常。
我可以毫无问题地从导入的 csv 设置数据帧的索引名称。即:
filename = './example.csv'
df = pd.read_csv(filename)
df.index.names = ['Index']
工作正常。
奇怪的是,如果我只是在没有 names 参数的情况下运行 concat 步骤,然后在单独的行中设置名称,这会很好。但是,一旦我使用该数据框,就会得到上面显示的回溯。即:
filename = './example.csv'
df = pd.read_csv(filename)
new_df = pd.concat([df, ], keys=['Sweep1', ])
new_df.index.names = ['Sweep', 'Index']
将运行,直到我去查看 new_df。更奇怪的是,我可以做new_df.head() 之类的事情,而且运行良好。但是,如果我只是在终端中输入new_df 并打印出来,我就会得到上面的回溯。
我不知道这里发生了什么,因此我们将不胜感激。
** 编辑 1**
这些是上面链接中提供的文件的前 5 行。
data_dict = {' LED': {0: -0.00030517578125,
1: 0.0,
2: -0.00030517578125,
3: -0.00030517578125,
4: -0.00030517578125,
5: 0.0},
' Primary': {0: -2.74688720703125,
1: -2.74566650390625,
2: -2.74627685546875,
3: -2.74810791015625,
4: -2.74749755859375,
5: -2.745361328125},
' Secondary': {0: -0.00152587890625,
1: -0.00457763671875,
2: -0.0048828125,
3: -0.00335693359375,
4: -0.0048828125,
5: -0.00518798828125},
'Time(ms)': {0: 0.0,
1: 0.10000000000000001,
2: 0.20000000000000001,
3: 0.29999999999999999,
4: 0.40000000000000002,
5: 0.5}}
df = pd.DataFrame(data_dict)
df.to_csv('temp.csv', index=False)
df = pd.read_csv('temp.csv')
pd.concat([df, ], keys=['Sweep1', ], names=['Sweep', 'Index'])
但是,这不会产生错误。
【问题讨论】:
-
什么是example.csv?
-
这是我的数据采集软件生成的csv文件。基本上它是四列数字数据,第一行是列标题。我提供了一个可用于重现此问题的文件的链接(尽管该问题在不同的文件中普遍存在)
-
对,但没有该数据的代表性示例,我们应该如何帮助您?
-
我不明白 - 我提供了一个可以使用的文件。
-
在您的代码中嵌入一小部分数据以生成数据帧。大多数人不太热衷于从互联网上的匿名人士那里下载随机文件
标签: python csv pandas multi-index