对.apply和lambda的使用感到困惑

时间:2018-03-10 16:22:17

标签: python dataframe lambda

遇到此代码后: enter image description here

我对.applylambda的使用感到困惑。首先.apply将所需的更改应用于指定的所有列中的所有元素或每列中的所有元素?其次,lambda x:中的x是否分别遍历指定列或列中的每个元素?第三,x.minx.max是否分别为指定列中的所有元素或每列的最小和最大元素提供了最小值或最大值?任何解释整个过程的答案都会让我感激不尽 感谢。

2 个答案:

答案 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)