我正在尝试使用 pandas.DataFrame.groupby['x']
对分组的 df
按 x
进行计算。
当 'x'
重复超过一次时,问题就出现了。apply 函数会根据 'x'
的重复次数执行相应次数的计算,但我只需要“汇总”值(它不是真正的聚合,而更像是处理)。
以下是一个玩具示例:
def simulate_complicated_func(df):
# This function simulates complicate calculations
returned_col_names = ['calc1', 'calc2', 'calc3']
df['calc1'] = ''.join(df['var1'])
df['calc2'] = df['var2'].mean()
df['calc3'] = ''.join(df['var1']) + str(df['var2'].max())
return df[['id'] + returned_col_names]
df = pd.DataFrame({'id':['id1', 'id1', 'id2', 'id3', 'id3', 'id3'],
'var1':['abc', 'cba', 'abc', 'cba', 'abc', 'cba'],
'var2':[9, 4, 7, 4, 1, 3]})
print(df)
id var1 var2
0 id1 abc 9
1 id1 cba 4
2 id2 abc 7
3 id3 cba 4
4 id3 abc 1
5 id3 cba 3
res_df = df.groupby(['id']).apply(simulate_complicated_func).drop_duplicates()
print(res_df)
id calc1 calc2 calc3
0 id1 abccba 6.500000 abccba9
2 id2 abc 7.000000 abc7
3 id3 cbaabccba 2.666667 cbaabccba4
输出结果正是我想要的,但效率不高。是否有更好的方法使用pandas来做到这一点?
编辑:如何优化?
如果我们在simulate_complicated_func()中添加一个打印语句。
def simulate_complicated_func(df):
# This function simulates complicate calculations
print("function called")
# ...
我们可以看到,该代码将会打印出6次:
function called
function called
function called
function called
function called
function called
事实上,我们只需要访问此函数3次(由groupby创建的组数)。