如何使用pandas.cut方法在Pandas DataFrame中创建新列?

时间:2017-11-30 05:49:18

标签: pandas

我的房屋价格如下:

0          0.0
1    1480000.0
2    1035000.0
3          0.0
4    1465000.0
5     850000.0
6    1600000.0
7          0.0
8          0.0
9          0.0
Name: Price, dtype: float64

我想创建一个名为data ['PriceRanges']的新列,它将每个价格设置在给定范围内。这就是我的代码:

data = pd.read_csv("Melbourne_housing_FULL.csv")
data.fillna(0, inplace=True)

for i in range(0, 12000000, 50000):
    bins = np.array(i)
    labels = np.array(str(i))


data['PriceRange'] = pd.cut(data.Price, bins=bins, labels=labels, right=True)

我收到此错误消息: TypeError:未确定对象的len()

我一直在尝试不同的方法,似乎被困在这里。我真的很感激一些帮助。

谢谢, 雨果

1 个答案:

答案 0 :(得分:0)

在循环中覆盖binslabels时出现问题,因此只有最后一个值。

for i in range(0, 12000000, 50000):
    bins = np.array(i)
    labels = np.array(str(i))

print (bins)
11950000

print (labels)
11950000

没有必要的循环,只有range使用numpy替代arange而标签创建范围。最后将参数include_lowest=True添加到cut,以便将bins0)的第一个值包含在第一组中。

bins = np.arange(0, 12000000, 50000)
labels = ['{} - {}'.format(i + 1, j) for i, j in zip(bins[:-1], bins[1:])] 
#correct first value 
labels[0] = '0 - 50000'
print (labels[:10])
['0 - 50000', '50001 - 100000', '100001 - 150000', '150001 - 200000', 
 '200001 - 250000', '250001 - 300000', '300001 - 350000', '350001 - 400000', 
 '400001 - 450000', '450001 - 500000']

data['PriceRange'] = pd.cut(data.Price, 
                            bins=bins, 
                            labels=labels, 
                            right=True, 
                            include_lowest=True)
print (data)
       Price         PriceRange
0        0.0          0 - 50000
1  1480000.0  1450001 - 1500000
2  1035000.0  1000001 - 1050000
3        0.0          0 - 50000
4  1465000.0  1450001 - 1500000
5   850000.0    800001 - 850000
6  1600000.0  1550001 - 1600000
7        0.0          0 - 50000
8        0.0          0 - 50000
9        0.0          0 - 50000