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



我应该首先说,我对panda和numpy(以及一般的机器学习(还很陌生。

我正在尝试学习一些基本的机器学习算法,并进行线性回归。我已经使用matlab完成了这个问题,但我想尝试在python中实现它,因为这是一种更实用的语言。我很难用这些库进行基本的矩阵运算,我认为这是因为我不了解Panda是如何索引数据帧的。。。

我发现了几篇关于iloc和ix之间差异的帖子,并且ix正在被弃用,所以使用iloc,但iloc给我带来了很多问题。我只是想把数据帧中的前n-1列拉到一个新的数据帧中,然后把最后一列拉到另一个数据帧中以获得我的标签值。然后我想执行一次成本函数,看看θ=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。因此,panda正确地进行了减法运算,并用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,为什么这不是默认行为?

看起来您实际想要进行的计算是在系列(单个列(上进行的。所以你应该能够做到:

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

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

或者像你最初建议的那样使用iloc,这让你更像矩阵式索引,你可以这样做:

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

因为在每个DataFrame中,您需要所有行和第一列

最新更新