Python 对.apply和lambda的用法感到困惑

Python 对.apply和lambda的用法感到困惑,python,dataframe,lambda,Python,Dataframe,Lambda,遇到此代码后: 我对.apply和lambda的用法感到困惑。首先,.apply是否将所需的更改应用于所有指定列中的所有元素,或逐个应用于每列?其次,lambda x:中的x是否分别迭代指定列或列中的每个元素?第三,x.min或x.max是否分别给出指定列中所有元素的最小值或最大值,或每个列的最小值和最大值?任何解释整个过程的答案都会让我非常感激。 谢谢。检查数据是否真的正常化了。因为x.min和x.max可能只取单个值的最小值和最大值,因此不会发生归一化 我认为这里是最好的避免apply-在

遇到此代码后:

我对
.apply
lambda
的用法感到困惑。首先,
.apply
是否将所需的更改应用于所有指定列中的所有元素,或逐个应用于每列?其次,
lambda x:
中的x是否分别迭代指定列或列中的每个元素?第三,
x.min
x.max
是否分别给出指定列中所有元素的最小值或最大值,或每个列的最小值和最大值?任何解释整个过程的答案都会让我非常感激。

谢谢。

检查数据是否真的正常化了。因为x.min和x.max可能只取单个值的最小值和最大值,因此不会发生归一化

我认为这里是最好的避免
apply
-在引擎盖下循环并按
列表中的列处理
DataFrame
的子集的方法:

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
编辑:

对于调试
应用
是创建自定义函数的最佳方法:

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)

指定所有列中的所有元素。x以每列为基础应用
x.min()
x.max()
我不知道。它们的范围不会比
apply
当前应用的列更广。@John我明白了
x.min()
x.max()
零件实际上非常有趣。因为如果x是一个元素,那么这些函数中的任何一个如何表示整个列的最小值或最大值?如果不迭代整个列,这是不可能的,很高兴知道Pandas提供了这样做的可能性,在C语言中,我只需要编写python来确保。
Max和min返回所选列的Max和min值(每列)我没有得到这个部分。你能详细说明一下吗?那么这些值在x遍历整个系列时返回?抱歉,我在理解问题时犯了一个错误。我明白了,所以当我们说
.apply(lambda x:(x-x.min())/(x.max()-x.min())
,这两个都是
x.min()
x.max()
值是在lambda x遍历所有内容后获得的,对吗?而且,它们分别应用于每一列(如您的答案中所示)?
apply
分别处理每个列-x是列,然后获取scala min和scalar max并返回新列。如果是这种情况,那么它是有意义的,因为我们希望分别对每个列进行归一化。@Huzo-是的,非循环解决方案也返回相同的输出。