Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?
Posted
技术标签:
【中文标题】Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?【英文标题】:Python, Pandas: 80/20 Randomly Split Data; How to loop when index value is 'missing'? 【发布时间】:2016-05-07 13:46:59 【问题描述】:我正在尝试遍历从现有数据集随机生成的 Series
数据类型,以用作训练数据集)。这是我的Series
数据集拆分后的输出:
Index data
0 1150
1 2000
2 1800
. .
. .
. .
1960 1800
1962 1200
. .
. .
. .
20010 1500
没有 1961 年的索引,因为创建训练数据集的随机选择过程删除了它。当我尝试循环计算我的残差平方和时,它不起作用。这是我的循环代码:
def ResidSumSquares(x, y, intercept, slope):
out = 0
temprss = 0
for i in x:
out = (slope * x.loc[i]) + intercept
temprss = temprss + (y.loc[i] - out)
RSS = temprss**2
return print("RSS: ".format(RSS))
KeyError: 'the label [1961] is not in the [index]'
我对 Python 还是很陌生,我不确定解决这个问题的最佳方法。
提前谢谢你。
【问题讨论】:
【参考方案1】:我在发布问题后立即找到了答案,我深表歉意。 @mkln 发表
How to reset index in a pandas data frame?
df = df.reset_index(drop=True)
这会重置整个Series
的索引,它不是DataFrame
数据类型独有的。
我更新的函数代码就像一个魅力:
def ResidSumSquares(x, y, intercept, slope):
out = 0
myerror = 0
x = x.reset_index(drop=True)
y = y.reset_index(drop=True)
for i in x:
out = slope * x.loc[i] + float(intercept)
myerror = myerror + (y.loc[i] - out)
RSS = myerror**2
return print("RSS: ".format(RSS))
【讨论】:
【参考方案2】:您省略了对ResidSumSquares
的实际调用。不重置函数内的索引并将训练集作为 x 传递怎么样?迭代一个不寻常的(不是 1,2,3,...)索引应该不是问题
【讨论】:
【参考方案3】:一些观察:
-
目前编写的函数是计算误差的平方和,而不是误差的平方和...这是故意的吗?后者通常用于回归类型的应用程序。由于您的变量名为
RSS
--我假设残差总和 of 个平方,您将需要重新访问。
如果x
和y
是同一个较大数据集的一致子集,那么您应该对两者都有相同的索引,对吧?否则,通过删除索引,您可能会匹配不相关的 x
和 y
变量并掩盖代码前面的错误。
由于您使用的是 Pandas,因此可以轻松对其进行矢量化以提高可读性和速度(Python 循环的开销很高)
(3)的示例,假设(2),并说明(1)中方法之间的差异:
#assuming your indices should be aligned,
#pandas will link xs and ys by index
vectorized_error = y - slope*x + float(intercept)
#your residual sum of squares--you have to square first!
rss = (vectorized_error**2).sum()
# if you really want the square of the summed errors...
sse = (vectorized_error.sum())**2
编辑:没有注意到这已经死了一年。
【讨论】:
以上是关于Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas: 如何将一列中的文本拆分为多行? | Python
如何通过拆分其中的字符串将单个列拆分为多个。 -Pandas Python [重复]