这是我上一篇关于使用负值的特定条件规范化数据帧列的文章的继续。
我使用的DataFrame如下:
import numpy as np
import pandas as pd
df = pd.DataFrame({'key' : [111, 222, 333, 444, 555, 666, 777, 888, 999],
'score1' : [-1, 0, 2, -1, 7, 0, 15, 0, 1],
'score2' : [2, 2, -1, 10, 0, 5, -1, 1, 0]})
print(df)
key score1 score2
0 111 -1 2
1 222 0 2
2 333 2 -1
3 444 -1 10
4 555 7 0
5 666 0 5
6 777 15 -1
7 888 0 1
8 999 1 0
score1
和score2
Series的可能值是-1
和所有正整数(包括0
)。我的目标是通过以下方式规范化两个列:
-1
,则返回缺少的NaN
值0
和1
之间范围内的剩余正整数进行规格化我对埃兹雷尔的解决方案非常满意。话虽如此,我继续研究我的问题,看看是否能想出一个替代的解决方案。以下是我的尝试:
def normalize(x):
if x == -1:
return np.nan
else:
return x/x.max()
df['norm1'] = df['score1'].apply(normalize)
不幸的是,这引发了以下AtiniteError:int对象没有属性max
。
我将score1
系列转换为float64
,但它并没有解决问题:“float”对象没有属性“max”
。
我还做了一个快速测试,用返回x/15(15
是score1
系列的最大值)替换第二个“返回”语句,它起作用了:
key score1 score2 norm1
0 111 -1.0 2 NaN
1 222 0.0 2 0.000000
2 333 2.0 -1 0.133333
3 444 -1.0 10 NaN
4 555 7.0 0 0.466667
5 666 0.0 5 0.000000
6 777 15.0 -1 1.000000
7 888 0.0 1 0.000000
8 999 1.0 0 0.066667
但这不是一个可行的解决方案。我希望能够除以系列的最大值,而不是硬编码。为什么我的解决方案不起作用,我如何修复我的代码?
理解“apply”函数的作用很重要:“apply”的“x”参数实际上是一行(如果在pd.Dataframe对象上应用f),或者直接是该行的唯一值(如果正在操作pd.Series对象)。
你在第二种情况下。想象一下,你有一个列表,而不是一个pd系列。
L = [1,2,3,4,5]
def normalize(x):
return(x/max(x))
normalize(L)
这里很清楚,max(x)没有任何意义。您要找的是max(L)
。
所以这在技术上是可以的:
L = [1,2,3,4,5]
def normalize(x):
return(x/max(L))
normalize(L)
但效率不是很高,因为每次迭代都要重新计算max(L)。所以
L = [1,2,3,4,5]
max_L = max(L)
def normalize(x,max_L):
return(x/max_L)
normalize(L)
会是你正在寻找的答案。和pd系列,它给
def normalize(x, col_max):
if x == -1:
return np.nan
else:
return x/col_max
df['norm1'] = df['score1'].apply(lambda x: normalize(x, df['score1'].max()))
请注意,不需要用-1替换NaNs来计算min()和max(),只需使用nanmin()和nanmax()。您可以像这样分开操作:
def create_nans(x):
if x == -1:
return np.nan
else:
return x
def normalize(x, col_max):
return(x/col_max) # make sure col_max != 0 or NaN
df['score1'] = df['score1'].apply(create_nans)
df['norm1'].apply(lambda x: normalize(x, df['score1'].nanmax()))
另一个解决方案,使用一个函数,将一个系列作为输入,而不是标量:
import numpy as np
import pandas as pd
df = pd.DataFrame({'key' : [111, 222, 333, 444, 555, 666, 777, 888, 999],
'score1' : [-1, 0, 2, -1, 7, 0, 15, 0, 1],
'score2' : [2, 2, -1, 10, 0, 5, -1, 1, 0]})
df['norm1'] = df['score1'].replace(-1, np.nan)
def normalize_series(s):
return (s - s.min()) / (s.max() - s.min())
df['norm1'] = normalize_series(df['norm1'])
如前所述,您的版本不起作用,因为您试图找到单个数字的最大值,而不是序列。
AttributeError:“float”对象没有属性“max”
错误的原因是,在代码中,您正在对列的每个(float)项调用max()函数,您可以将列的最大值传递给normalize
函数:
def normalize(x, col_max):
if x == -1:
return np.nan
else:
return x/col_max
并按如下方式编辑norm1列创建代码:
df['norm1'] = df['score1'].apply(lambda x: normalize(x, df['score1'].max()))
问题内容: 我想转换火花数据框架以使用以下代码添加: 详细的错误消息是: 有人知道我在这里做错了吗?谢谢! 问题答案: 您无法使用数据框,但可以将数据框转换为RDD并通过映射将其映射。在Spark 2.0之前,别名为。使用Spark 2.0,您必须先明确调用。
问题内容: 我如何解决此错误,我是从GitHub下载此代码的。 引发错误 请帮我解决这个问题! 我用了: 我得到这个错误。有人帮我,我只想让它工作为什么这么难? 问题答案: 我怀疑您从中复制代码的地方启用了急切执行功能,即在程序开始时调用了该位置。 您也可以这样做。希望能有所帮助。 更新:请注意,默认情况下,TensorFlow 2.0中启用了急切执行。因此,以上答案仅适用于TensorFlow
问题内容: 下面的代码给出了错误: 码: 问题答案: 从代码中,我可以看到你希望允许用户下载pdf。 现在开始 去 http://localhost:5000
问题内容: 当我尝试时,会发生错误: 我找到了带有pyelasticsearch.py 的链接https://github.com/toastdriven/pyelasticsearch/blob/master/pyelasticsearch.py#L424-469,但我不知道它是哪个版本。无论如何,该代码中没有购买我的pyelasticsearch.py。任何人都有相同的经历吗?感谢您的
我和cloud composer一起策划了两个数据流工作,它已经工作了一个月了。突然,这两个作业停止工作,并出现以下错误消息: 在作业中,我用存储客户端从google cloud storage下载一个文件。我以为这是因为一些依赖问题。在composer环境中,我安装了google-cloud-storage,但没有指定版本。我尝试指定包的不同版本,但似乎没有任何工作。 谢了!
问题内容: 我正在使用Flask开发论坛模板。当我尝试使用表单在浏览器中创建新线程时,SQLAlchemy抛出AttributeError。当我尝试与论坛到线程实现一对多关系以及与线程到用户实现一对多关系时,出现了问题。 models.py 所有新的帖子/主题,并在views.py中处理 views.py 问题答案: 问题是这样的: 你要使用ORM对象,而不是主键列: 该错误表示整数被解释为ORM