熊猫iloc错误的索引导致减法问题

时间:2018-11-22 20:23:24

标签: python pandas

我首先要说我对熊猫和numpy(以及一般的机器学习)还是陌生的。

我正在尝试学习一些基本的机器学习算法,并且正在做线性回归。我已经使用matlab完成了此问题,但想尝试在python中实现它-因为这是一种更实际使用的语言。我在使用这些库进行基本矩阵运算时遇到了非常困难的时间,我认为这是由于缺乏对熊猫如何索引数据帧的理解...

我发现有几篇文章谈论iloc和ix之间的区别,并且不赞成使用ix,所以请使用iloc,但是iloc会给我带来很多麻烦。我只是想将一个数据框中的前n-1列拉到一个新的数据框中,然后将最后一列拉到另一个数据框中以获取我的标签值。然后,我想执行一次成本函数,以查看theta = 0时我当前的成本。当前,我的数据集只有一个标签-但我想编码,好像我有更多标签一样。这是我的代码和输出:

path = os. getcwd() + '\\ex1data1.txt'
data = pd.read_csv(path, header=None)

numRows = data.shape[0]
numCols = data.shape[1]

X = data.iloc[:,0:numCols-1].copy()
theta = pd.DataFrame(np.zeros((X.shape[1], 1)))
y = data.iloc[:,-1].copy()

#start computing cost sum((X-theta)-y).^2)
predictions = X.dot(theta)
print("predictions shape: {0}".format(predictions.shape))
print(predictions.head())
print("y shape: {0}".format(y.shape))
print(y.head())

errors = predictions.subtract(y)

print("errors shape: {0}".format(errors.shape))
print(errors.head())

输出:

predictions shape: (97, 1)
 0
0  0.0
1  0.0
2  0.0
3  0.0
4  0.0
y shape: (97, 1)
     1
0  17.5920
1   9.1302
2  13.6620
3  11.8540
4   6.8233
errors shape: (97, 2)
0   1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN

我可以看到y和X具有相同的形状,但是由于某些原因,当我显示它们时-似乎y从第1列(它在第一个数据帧中的原始位置)开始索引,而X有了其原始列结果是0。因此,熊猫正在正确进行减法运算,并用NaN替换所有丢失的值。由于y没有第0列的值,它们都是NaN,而X没有第1列的值,它们都是NaN,结果是97x2 NaN矩阵。

如果我使用‍‍‍ y = data.ix[:,-1:0]-上面的代码进行了正确的计算。输出:

 errors shape: (97, 1)
         0
     0 -6.1101
     1 -5.5277
     2 -8.5186
     3 -7.0032
     4 -5.8598

但是我一直试图远离ix,因为它已经过时了。

如何告诉pandas新矩阵的起始列为0,为什么这不是默认行为?

1 个答案:

答案 0 :(得分:2)

看起来您实际上想要进行的计算是在系列上(各个列)。因此,您应该可以:

predictions[0].subtract(y[1])

获得所需的值。这看起来有点令人困惑,因为您有数字作为DataFrame列,正在选择所需的列(0和1)并在它们之间进行减法。

或者像您最初建议的那样使用iloc,这可以使您更像矩阵样式索引,您可以执行以下操作:

predictions.iloc[:, 0].subtract(y.iloc[:, 0])

因为要在每个DataFrame中全部行和第一