熊猫将自定义功能应用于由另一列分组的一列的每一行

让我们

我有一个包含两列的数据框:idval

df = pd.DataFrame ({'id': [1,1,1,2,2,2,3,3,3,3], 'val' : np.random.randn(10)})

   id       val
0   1  2.644347
1   1  0.378770
2   1 -2.107230
3   2 -0.043051
4   2  0.115948
5   2  0.054485
6   3  0.574845
7   3 -0.228612
8   3 -2.648036
9   3  0.569929

我想将自定义函数val应用于id假设我要应用最小-最大缩放。这就是我使用for循环的方式:

df['scaled']=0
ids = df.id.drop_duplicates()
for i in range(len(ids)):
    df1 = df[df.id==ids.iloc[i]]
    df1['scaled'] = (df1.val-df1.val.min())/(df1.val.max()-df1.val.min())
    df.loc[df.id==ids.iloc[i],'scaled'] = df1['scaled']

结果是:

   id       val    scaled
0   1  0.457713  1.000000
1   1 -0.464513  0.000000
2   1  0.216352  0.738285
3   2  0.633652  0.990656
4   2 -1.099065  0.000000
5   2  0.649995  1.000000
6   3 -0.251099  0.306631
7   3 -1.003295  0.081387
8   3  2.064389  1.000000
9   3 -1.275086  0.000000

我怎样才能更快地做到这一点而没有循环?

布拉德·所罗门

您可以使用groupby

In [6]: def minmaxscale(s): return (s - s.min()) / (s.max() - s.min())                                                                                           

In [7]: df.groupby('id')['val'].apply(minmaxscale)                                                                                                            
Out[7]: 
0    0.000000
1    1.000000
2    0.654490
3    1.000000
4    0.524256
5    0.000000
6    0.000000
7    0.100238
8    0.014697
9    1.000000
Name: val, dtype: float64

(请注意,np.ptp()可以使用/峰峰值代替s.max() - s.min()。)

这会将功能应用于按分组的minmaxscale()每个较小的Series valid

以第一组为例:

In [11]: s = df[df.id == 1]['val']                                                                                                                            

In [12]: s                                                                                                                                                    
Out[12]: 
0    0.002722
1    0.656233
2    0.430438
Name: val, dtype: float64

In [13]: s.max() - s.min()                                                                                                                                    
Out[13]: 0.6535106879021447

In [14]: (s - s.min()) / (s.max() - s.min())                                                                                                                  
Out[14]: 
0    0.00000
1    1.00000
2    0.65449
Name: val, dtype: float64

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R按一列分组并将自定义函数应用于另一列

如何将自定义函数应用于数据框的每一列

如何将自定义功能应用于每一行的熊猫数据框

将自定义函数应用于R中数据帧中每一行的两列

将自定义按钮添加到jQuery DataTable中每一行的最后一列

如何将函数应用于熊猫数据框中一列的每一行?

将自定义函数应用于r中的每一行

将自定义函数应用于pandas中的一列列表,如何处理异常?

熊猫将列表值从一列应用于另一列

按年份分组并将功能应用于另一列-Python,Pandas

如何自定义HTML中每一列的第一行?

迭代CSV中的每一列并将加密应用于每一列

熊猫:将了解列类型的函数应用于数据框的每一列

在熊猫中,如何将函数应用于返回两列的每一列

在熊猫的另一列中找到列的每一行的索引

熊猫:在从第一列拆分每一行的同时创建另一列

MySQL,对一列应用一个函数,然后为每一行更新另一列

将函数应用于矩阵的每一列

按一列分组,然后将2列应用于列表熊猫

在每一行上应用函数。是否检查行中每一列的条件并应用于所有列

将自定义函数一次应用于分组的数据帧n行

熊猫:根据另一列中的值计算每一行的jaccard相似度

熊猫将功能应用于具有前一列值的列

熊猫将条件应用于基于另一列的列值

熊猫复制列元素并基于相关列表应用于另一列

将功能应用于数据框的每一列

从每一行的另一列中减去一列的内容

无法添加具有应用于另一列的功能的新列

熊猫分组但保留另一列