如何在pandas中为每个ID#矢量化一个函数

时间:2018-04-17 14:43:13

标签: python pandas data-munging

这种方法是时间/ CPU密集型的,必须有更好的方法!有人可以帮我在不使用循环的情况下对以下代码进行矢量化吗?基本上,我有一个df,每个主题有多行,每行都有一个值。我想添加一个列,显示每个主题的最高值(对于主题的每一行都是相同的)。

import pandas as pd
import numpy as np
from numpy import nan

compare_table = pd.DataFrame({
    'id': [1,1,1,2,2,3,3,3],
    'day#': [1, 2, 3, 1, 2, 1, 2, 3],
    'random#': [2,5,1,6, 4, 5, 9, 3],
     'highest_random#': [nan, nan, nan, nan, nan, nan, nan, nan]}, columns=[
    'id', 'day#','random#','highest_random#'])

for element in list(compare_table['id'].unique()):
        highest_random = max(compare_table.loc[compare_table.loc[:,'id']==element, 'random#'])
        compare_table.loc[compare_table.loc[:,'id']==element, 'highest_random#']= highest_random

1 个答案:

答案 0 :(得分:2)

maxmap聚合Series使用GroupBy.transform

compare_table['highest_random#1'] = compare_table.groupby('id')['random#'].transform('max')

#a bit slowier alternative
s = compare_table.groupby('id')['random#'].max()
compare_table['highest_random#2'] = compare_table['id'].map(s)
print (compare_table)
   id  day#  random#  highest_random#  highest_random#1  highest_random#2
0   1     1        2              5.0                 5                 5
1   1     2        5              5.0                 5                 5
2   1     3        1              5.0                 5                 5
3   2     1        6              6.0                 6                 6
4   2     2        4              6.0                 6                 6
5   3     1        5              9.0                 9                 9
6   3     2        9              9.0                 9                 9
7   3     3        3              9.0                 9                 9