我有一个2171列和200多个行的df。我想将这些列的范围归一化。
[输入df]
Time '340.0' '341.0' '342.0' 'Mode'
11:30:15 PM 0.25 0.35 0.65 light
11:31:15 PM 0.22 0.30 0.62 auto
11:32:15 PM 0.32 0.39 0.98 auto
.
.
.
[如果仅在一个col上使用,我不确定如何将其应用于一系列cols]
sr_df['340.0'] = sr_df['340.0'].apply(lambda x: (x - x.mean()) / (x.std()))
我对python很陌生,我不确定为什么会出现以下错误:
AttributeError: 'float' object has no attribute 'mean'
答案 0 :(得分:0)
您可以一次将归一化应用于所有所需的列:
sr_df[['340.0', '341.0', '342.0']].apply(lambda x: ((x-x.mean()) / (x.std())))
sr_df[['340.0', '341.0', '342.0']]= sr_df[['340.0', '341.0', '342.0']].apply(lambda x: ((x-x.mean()) / (x.std())))
>>> sr_df
Time 340.0 341.0 342.0 Mode
0 11:30:15 PM -0.259828 0.073922 -0.500626 light
1 11:31:15 PM -0.844441 -1.034910 -0.650814 auto
2 11:32:15 PM 1.104269 0.960988 1.151440 auto
更好的是,您可以将其应用于所有数字列(如果要这样做):
# Get a list of numeric columns:
cols = list(sr_df.select_dtypes(include=[np.number]).columns.values)
sr_df[cols] = sr_df[cols].apply(lambda x: ((x-x.mean()) / (x.std())))
如果要修复代码,可以将函数应用于数据框的一列(而不是应用于系列)。 @BrenBarn在this answer中概述了它不适用于系列的原因:
在
series
上使用apply时,将在每个元素上调用函数。在DataFrame
上使用apply时,将在每个列上调用您的函数。
因此,您正在尝试获取浮点数的mean
和std
,而浮点数没有这样的属性,从而导致错误:{{1 }}
AttributeError: 'float' object has no attribute 'mean'
答案 1 :(得分:0)
您也可以使用MinMaxScaler中的Sklean。它将自动适合/缩放0到1之间的所有值。请参见this example和this one。
func QueryDB(qstring string) (*sql.Rows) {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s dbname=%s sslmode=disable", host, port, user, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
//Ping method opens the connection
err = db.Ping()
if err != nil {
panic(err)
}
//rows, err := db.Query("SELECT name FROM users WHERE age = $1", age)
log.Printf("executing SQL %s\n",qstring)
rows, err := db.Query(qstring)
if err != nil {
log.Fatal(err)
}
return rows
}