pandas cut:如何将分类标签转换为字符串(否则无法导出到Excel)?

19
我使用pandas.cut()将连续变量离散化为一定范围,然后按结果进行分组。
经过很多痛骂,因为我找不到问题出在哪里,我学会了如果我不提供自定义标签给cut()函数,而是依赖于默认值,那么输出就无法导出到Excel。如果我尝试这样做:
import pandas as pd
import numpy as np    

writer = pd.ExcelWriter('test.xlsx')
wk = writer.book.add_worksheet('Test')

df= df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
df['range'] = pd.cut( df['a'],[-np.inf,3,8,np.inf] )
grouped=df.groupby('range').sum()
grouped.to_excel(writer, 'Export')
writer.close()

我得到:

raise TypeError("Unsupported type %s in write()" % type(token))
TypeError: Unsupported type <class 'pandas._libs.interval.Interval'> in write()
which it took me a while to decypher.

如果我分配标签:

df['range'] = pd.cut( df['a'],[-np.inf,3,8,np.inf], labels =['<3','3-8','>8'] )
然后一切都很好地运行。 有没有不使用自定义标签处理此问题的建议?在我的工作的初始阶段,我倾向于不分配标签,因为我仍然不知道我想要多少个箱子-这是一个试错方法,并且在每次尝试时分配标签将耗费时间。 我不确定这是否算得上一个错误,但至少它似乎是一个文档不完善的恼人之处!

df['range'] = pd.cut(df['a'],[-np.inf,3,8,np.inf], labels =['<3','3-8','>8']).astype(str) - Paul H
问题是如何在不显式分配标签的情况下完成它。 - Pythonista anonymous
你可以忽略labels关键字参数,据我所知。 - Paul H
你没有读懂我的问题。如果我不包含标签,那么我就无法导出Excel - 这就是问题所在!!我需要按下面的答案进行astype(str)。 - Pythonista anonymous
这正是我在第二条评论中所建议的。 - Paul H
1个回答

20

使用astype(str)

writer = pd.ExcelWriter('test.xlsx')
wk = writer.book.add_worksheet('Test')

df= df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
df['range'] = pd.cut( df['a'],[-np.inf,3,8,np.inf] ).astype(str)
grouped=df.groupby('range').sum()
grouped.to_excel(writer, 'Export')
writer.close()

在 Excel 中输出:

range   a   b   c   d   e
(-inf, 3.0] 6798    17277   16979   17266   16949
(3.0, 8.0]  33150   28051   27551   27692   27719
(8.0, inf]  9513    5153    5318    5106    5412

在这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接