如何为 pandas 中的每个 ID# 向量化函数
How to vectorize a function for each ID# in pandas
此方法 time/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
使用 GroupBy.transform
通过 max
或 map
聚合 Series
:
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
此方法 time/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
使用 GroupBy.transform
通过 max
或 map
聚合 Series
:
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