均值归一化不同版本的代码
Mean normalization different versions of code
我想规范化我的数据框,当我实现第一个版本的代码时,我得到了规范化的值,但是当我实现版本 2 时,我收到一个名为 stop iteration
的错误。 ["1B","2B","3B","HR","BB"]
是我的数据框中的列。
版本 1:
def meanNormalizeRates(df):
subRates = df[["1B","2B","3B","HR","BB"]]
df[["1B","2B","3B","HR","BB"]] = subRates - subRates.mean(axis=0)
return df
stats = stats.groupby('yearID').apply(meanNormalizeRates)
stats.head()
版本 2:
def mean(df):
for val in ["1B","2B","3B","HR","BB"]:
stats[val] = stats[val] -stats[val].mean(axis=0)
stats = stats.groupby('yearID').apply(mean)
stats.head()
我无法理解这两个版本之间的区别。
一个很好的例子
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
'gate' : [9, 7, 4,6, 9]}
frame = pd.DataFrame(data)
frame.head()
版本 1.1
def std(df):
temp = df[['gate', 'pop']]
df[['gate', 'pop']] = temp - temp.mean(axis=0)
return df
frame.groupby('year').apply(std)
gate pop state year
0 9 1.5 Ohio 2000
1 7 1.7 Ohio 2001
2 4 3.6 Ohio 2002
3 6 2.4 Nevada 2001
4 9 2.9 Nevada 2002
版本 1.2
def mean(df):
for val in ['gate', 'pop']:
df[val] = df[val]- df[val].mean(axis=0)
frame.groupby('year').apply(mean)
error: stop iteration
好的,因为你的 mean()
函数中没有 return 语句(在示例 1.2 中),该函数只是 returns None
for每个组。您收到的 StopIteration
错误并不是那么清楚,但实际情况是:
apply()
在每个组上调用您的 mean()
函数。
- 每个调用 returns
None
.
- 结果被放入一个列表中,所以这里是所有的列表
None
s
- 作为尝试将结果拼接在一起的一部分,
apply()
试图在列表中找到非 None
值,
抛出 StopIteration
异常。
所以基本上你可以重现错误:
eg_list = [None, None, None]
v = next(v for v in eg_list if v is not None)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-12-93b31b7a51e4> in <module>()
----> 1 v = next(v for v in eg_list if v is not None)
虽然所有这些可能都太详细了——要点是当你
使用 apply()
,您实际上不应该在
您正在应用的函数 - 您应该 returning 函数的结果
并将它们分配回数据框,例如:
# The lambda here will return the relevant values of gate and pop,
# and we just assign them wherever we want in the dataframe.
# Could be new columns, could be existing ones
frame[['gate', 'pop']] = frame.groupby('year')[['gate', 'pop']].apply(
lambda group: group - group.mean(axis=0))
我想规范化我的数据框,当我实现第一个版本的代码时,我得到了规范化的值,但是当我实现版本 2 时,我收到一个名为 stop iteration
的错误。 ["1B","2B","3B","HR","BB"]
是我的数据框中的列。
版本 1:
def meanNormalizeRates(df):
subRates = df[["1B","2B","3B","HR","BB"]]
df[["1B","2B","3B","HR","BB"]] = subRates - subRates.mean(axis=0)
return df
stats = stats.groupby('yearID').apply(meanNormalizeRates)
stats.head()
版本 2:
def mean(df):
for val in ["1B","2B","3B","HR","BB"]:
stats[val] = stats[val] -stats[val].mean(axis=0)
stats = stats.groupby('yearID').apply(mean)
stats.head()
我无法理解这两个版本之间的区别。
一个很好的例子
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
'gate' : [9, 7, 4,6, 9]}
frame = pd.DataFrame(data)
frame.head()
版本 1.1
def std(df):
temp = df[['gate', 'pop']]
df[['gate', 'pop']] = temp - temp.mean(axis=0)
return df
frame.groupby('year').apply(std)
gate pop state year
0 9 1.5 Ohio 2000
1 7 1.7 Ohio 2001
2 4 3.6 Ohio 2002
3 6 2.4 Nevada 2001
4 9 2.9 Nevada 2002
版本 1.2
def mean(df):
for val in ['gate', 'pop']:
df[val] = df[val]- df[val].mean(axis=0)
frame.groupby('year').apply(mean)
error: stop iteration
好的,因为你的 mean()
函数中没有 return 语句(在示例 1.2 中),该函数只是 returns None
for每个组。您收到的 StopIteration
错误并不是那么清楚,但实际情况是:
apply()
在每个组上调用您的mean()
函数。- 每个调用 returns
None
. - 结果被放入一个列表中,所以这里是所有的列表
None
s - 作为尝试将结果拼接在一起的一部分,
apply()
试图在列表中找到非None
值, 抛出StopIteration
异常。
所以基本上你可以重现错误:
eg_list = [None, None, None]
v = next(v for v in eg_list if v is not None)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-12-93b31b7a51e4> in <module>()
----> 1 v = next(v for v in eg_list if v is not None)
虽然所有这些可能都太详细了——要点是当你
使用 apply()
,您实际上不应该在
您正在应用的函数 - 您应该 returning 函数的结果
并将它们分配回数据框,例如:
# The lambda here will return the relevant values of gate and pop,
# and we just assign them wherever we want in the dataframe.
# Could be new columns, could be existing ones
frame[['gate', 'pop']] = frame.groupby('year')[['gate', 'pop']].apply(
lambda group: group - group.mean(axis=0))