迭代pandas数据框架时的KeyError

c9x0cxw0  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(120)

我试图对数据集进行线性回归,收集几个公寓的表面和租金。
下面是Python中显示的数据集示例:Dataset
我们模型的形式是:
y^=xT.θ,其中:xT=(x1,x2,x3,...,xN),y^T=(y1^,y2^,y3^,...,yN ^)
在我们的案例中:xTi=(1,vi1),其中vi1 =第i个单元的表面,因此我们有:yi^=xTiθ=θ0 + θ1×vi1
然后我们定义了模型的经验风险:E= Σ Ni=1|| xTiθ−yi|| 2我们试图找到使E最小化的θ:θ^=argminθE
要使用Python实现这一点,本课程使用以下代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

house_data = pd.read_csv('house.csv')

X = np.matrix([np.ones(house_data.shape[0]), house_data['surface'].values]).T

y = np.matrix(house_data['loyer']).T

theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)

print(theta)

字符串
课程给出的X的解决方案是使用np.matrix(),但我试图使用np.arrays()来获得X的等价物:
此问题基于名为“Get Started with Machine Learning”的OpenClassrooms类https://openclassrooms.com/fr/courses/4011851-initiez-vous-au-machine-learning/4121986-programmez-votre-premiere-regression-lineaire
为了有一个X的等价物,我使用了以下代码行:

x = house_data['surface']
for i in range(len(x)):
    A = [1,x[i]]
    X.append(A)


我不能解释为什么,但它在11个第一次迭代中工作,然后它返回一个KeyError:11
有人可以解释一下KeyError:11是并且是否可能使用np.array()来获得X的表达式?
下面是我的代码的全部:

import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

house_data = pd.read_csv('house.csv')
house_data = house_data[house_data['loyer']<10000]
x = house_data['surface']
y = house_data['loyer']
X = []

for i in range(len(x)):
    A = [1,x[i]]
    X.append(A)


下面是print(x):x

blmhpbnm

blmhpbnm1#

你能在你的问题中发布更多的代码吗?
我试了一下,效果很好:

>>> import pandas as pd
>>> house_data = pd.read_csv('house.csv')
>>> X = []
>>> x = house_data['surface']
>>> for i in range(len(x)):
...   A = [1,x[i]]
...   X.append(A)

字符串
因此,解决你的问题的一个方法是这样做:

import pandas as pd 

house_data = pd.read_csv('house.csv')
x = house_data['surface']
y = house_data['loyer']
X = []

for i in range(len(x)):
    A = [1,x[i]]
    if y[i] < 10000:
        X.append(A)


然而,这并没有回答你的问题:你为什么要得到KeyError
答案是pandas dataframe不是按 position 索引的,而是按dataframe的 index 列索引。默认情况下,dataframe的索引列与position一样开始,但执行的操作与行相同

house_data = house_data[house_data['loyer']<10000]


您最终可能会消除数据框架的行并因此丢弃索引值。要了解发生了什么,请考虑以下示例:

>>> small_house_data = pd.DataFrame(data={'surface': [37, 52, 42], 'loyer': [8888, 11111, 7777]})
>>> small_house_data
   surface  loyer
0       37   8888
1       52  11111
2       42   7777
>>> small_house_data2 = small_house_data[small_house_data['loyer'] < 10000]
>>> small_house_data2
   surface  loyer
0       37   8888
2       42   7777
>>> len(small_house_data2)
2
>>> small_house_data2[1]
Traceback (most recent call last):
   .... lots of lines of ugly traceback omitted ....
KeyError: 1


这里有一个KeyError,因为small_house_data2没有索引值1
有两种基本方法可以解决这个问题:在您选择了loyer小于10000的点之后,重置house_data Dataframe 上的索引,或者在for循环中迭代 Dataframe 的实际索引而不是范围。
那就是:

house_data = pd.read_csv('house.csv')
house_data = house_data[house_data['loyer']<10000]
x = house_data['surface']
y = house_data['loyer']
X = []

for i in x.index:
    A = [1,x[i]]
    X.append(A)


或者是

house_data = pd.read_csv('house.csv')
house_data = house_data[house_data['loyer']<10000]
house_data = house_data.reset_index(drop=True)
x = house_data['surface']
y = house_data['loyer']
X = []

for i in range(len(x)):
    A = [1,x[i]]
    X.append(A)

相关问题