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-是的,非循环解决方案也返回相同的输出。