Python 导致减法问题的iloc错误索引
首先,我应该说,我对熊猫和numpy(以及一般的机器学习)相当陌生 我正在学习一些基本的机器学习算法,并且正在做线性回归。我已经用matlab完成了这个问题,但我想尝试用python实现它——因为python是一种更实用的语言。我在使用这些库进行基本的矩阵运算时遇到了困难,我认为这是因为我不了解pandas是如何索引数据帧的 我发现有几篇文章讨论了iloc和ix之间的差异,ix被弃用,所以请使用iloc,但iloc给我带来了很多问题。我只是尝试将数据帧中的前n-1列拉入新的数据帧,然后将最后一列拉入另一个数据帧以获取标签值。然后我想执行一次成本函数,看看θ=0时我的当前成本是多少。目前,我的数据集只有一个标签——但我想编码,就好像我有更多标签一样。以下是我的代码和输出:Python 导致减法问题的iloc错误索引,python,pandas,Python,Pandas,首先,我应该说,我对熊猫和numpy(以及一般的机器学习)相当陌生 我正在学习一些基本的机器学习算法,并且正在做线性回归。我已经用matlab完成了这个问题,但我想尝试用python实现它——因为python是一种更实用的语言。我在使用这些库进行基本的矩阵运算时遇到了困难,我认为这是因为我不了解pandas是如何索引数据帧的 我发现有几篇文章讨论了iloc和ix之间的差异,ix被弃用,所以请使用iloc,但iloc给我带来了很多问题。我只是尝试将数据帧中的前n-1列拉入新的数据帧,然后将最后一列
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。因此,pandas正确地进行了减法运算,并用NaN替换了任何缺失的值。由于y没有第0列值,它们都是NaN
,而X没有第1列值,它们都是NaN
,从而形成一个97x2NaN
矩阵
如果我使用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,因为有人说它是不受欢迎的
如何告诉熊猫新矩阵的起始列为0,为什么这不是默认行为?看起来您实际要进行的计算是在序列(单个列)上进行的。因此,您应该能够做到:
predictions[0].subtract(y[1])
以获得所需的值。这看起来有点令人困惑,因为您将数字作为数据帧列,您正在选择所需的列(0和1)并在它们之间执行减法
或者像您最初建议的那样使用iloc,这更像是矩阵式索引,您可以这样做:
predictions.iloc[:, 0].subtract(y.iloc[:, 0])
因为在每个数据帧中,您需要所有行和第一列非常感谢您的帮助!我没有意识到列,或者更确切地说是列名,很重要。有没有更简洁的方法将一个矩阵转换为两个独立的矩阵?还是我的做法可以接受?谢谢你的帮助