pandas 将 Int64Index 更改为 Index 并将 dtype=int64 更改为 dtype=object
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14471120/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Change Int64Index to Index and dtype=int64 to dtype=object
提问by dmvianna
I am trying to write pandas DataFrame and Series to xlwt Worksheet objects. All goes well except if I try to write numpy.int64 data, in which case xlwt gasps. Changing int64 to float64 in my data and single-level indexes is simple, but what would be the right way of doing that for MultiIndexes?
我正在尝试将 pandas DataFrame 和 Series 写入 xlwt Worksheet 对象。一切都很顺利,除非我尝试写入 numpy.int64 数据,在这种情况下 xlwt 喘不过气来。在我的数据和单级索引中将 int64 更改为 float64 很简单,但是对于 MultiIndexes 这样做的正确方法是什么?
t = pd.DataFrame(np.array(np.mat('0 1 0 1; 1 0 2 3; 1 1 2 4')))
arrays = [[1,2,3,4],[5,6,7,8]]
tuples = zip(*arrays)
index = pd.MultiIndex.from_tuples(tuples, names=['First','Second'])
t.columns = index
wb = xlwt.Workbook()
ws_1 = wb.add_sheet('simple index', cell_overwrite_ok=True)
In [137]: t
Out[137]:
First 1 2 3 4
Second 5 6 7 8
0 0 1 0 1
1 1 0 2 3
2 1 1 2 4
In [157]: t.ix[0][1][5]
Out[157]: 0
In [158]: ws_1.row(0).write(0, t.ix[0][1][5])
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
File "C:\Python27\lib\site-packages\xlwt\Row.py", line 259, in write
raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <type 'numpy.int64'>
In [159]: t.dtypes
Out[159]:
First Second
1 5 int64
2 6 int64
3 7 int64
4 8 int64
In [160]: idx = t.dtypes[t.dtypes == np.int64].index
In [161]: idx
Out[161]:
MultiIndex
[(1, 5), (2, 6), (3, 7), (4, 8)]
In [163]: for i in idx:
.....: t[i] = t[i].astype(np.float64)
.....:
In [164]: t.dtypes
Out[164]:
First Second
1 5 float64
2 6 float64
3 7 float64
4 8 float64
In [165]: ws_1.row(0).write(0, t.ix[0][1][5])
In [167]: t.columns.levels
Out[167]: [Int64Index([1, 2, 3, 4], dtype=int64), Int64Index([5, 6, 7, 8], dtype=int64)]
In [168]: t.columns
Out[168]:
MultiIndex
[(1, 5), (2, 6), (3, 7), (4, 8)]
In [169]: t.columns[0][0]
Out[169]: 1
In [170]: ws_1.row(0).write(0, t.columns[0][0])
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
File "C:\Python27\lib\site-packages\xlwt\Row.py", line 259, in write
raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <type 'numpy.int64'>
采纳答案by dmvianna
for i in range(len(t.columns.levels)):
if t.columns.levels[i].dtype == np.int64:
t.columns.levels[i] = t.columns.levels[i].astype(np.float64)

