我对.apply
和lambda
的使用感到困惑。首先.apply
将所需的更改应用于指定的所有列中的所有元素或每列中的所有元素?其次,lambda x:
中的x是否分别遍历指定列或列中的每个元素?第三,x.min
或x.max
是否分别为指定列中的所有元素或每列的最小和最大元素提供了最小值或最大值?任何解释整个过程的答案都会让我感激不尽
感谢。
答案 0 :(得分:1)
检查数据是否真的正常化。因为x.min和x.max可以简单地取单个值的最小值和最大值,因此不会发生归一化。
答案 1 :(得分:1)
我认为这是最好的避免apply
- 循环,并使用来自DataFrame
的列list
的子集:
df = pd.DataFrame({'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')})
print (df)
c = ['B','C','D']
因此,首先选择所选列的最小值和类似的最大值:
print (df[c].min())
B 4
C 2
D 0
dtype: int64
然后减去并除以:
print ((df[c] - df[c].min()))
B C D
0 0 5 1
1 1 6 3
2 0 7 5
3 1 2 7
4 1 0 1
5 0 1 0
print (df[c].max() - df[c].min())
B 1
C 7
D 7
dtype: int64
df[c] = (df[c] - df[c].min()) / (df[c].max() - df[c].min())
print (df)
A B C D E F
0 a 0.0 0.714286 0.142857 5 a
1 b 1.0 0.857143 0.428571 3 a
2 c 0.0 1.000000 0.714286 6 a
3 d 1.0 0.285714 1.000000 9 b
4 e 1.0 0.000000 0.142857 2 b
5 f 0.0 0.142857 0.000000 4 b
编辑:
对于调试apply
最好创建自定义函数:
def f(x):
#for each loop return column
print (x)
#return scalar - min
print (x.min())
#return new Series - column
print ((x-x.min())/ (x.max() - x.min()))
return (x-x.min())/ (x.max() - x.min())
df[c] = df[c].apply(f)
print (df)