我正在尝试使用熊猫聚合整个数据框,而不进行任何分组。
我确实需要为不同的列使用不同的函数,所以我使用的是字典,但是将“ first”或“ last”作为聚合函数传递会引发 ValueError:无结果,而其他诸如“ min'/'max'/'mean'没问题。
这是代码的简化。
exec
使用
df = pd.DataFrame({'Col1':[1,2,3,4], 'Col2':[5,6,7,8], 'Col3':[9,10,11,12]})
func = {col: ['first', 'last'] if col in ['Col1']
else ['first', 'last', 'mean'] if col in ['Col2']
else 'mean' for col in df.columns}
result = df.agg(func)
做这项工作,但速度很慢,我认为是由于groupby。 该数据框已经是较大数据框的子集,无法进一步分组。
我有数百列,我无法单独汇总它们。
是否有比分组更快或更有效的方法来获取第一行和最后一行以及不同的聚合?
对于这样的示例数据框
result = df.groupby(lambda _ : True).agg(func)
输出应为
Col1 Col2 Col3
0 1 5 9
1 2 6 10
2 3 7 11
3 4 8 12
编辑:与原始的groupby函数一样,不应删除任何空值/列。
答案 0 :(得分:0)
df = pd.DataFrame({'Col1':[1,2,3,4], 'Col2':[5,6,7,8], 'Col3':[9,10,11,12]})
group_1 = ['Col1']
group_2 = ['col2']
func = {col:[fvalue, lvalue] if col in group_1
else [fvalue, lvalue, 'mean'] if col in group_2
else 'mean' for col in df.columns}
df.agg(func).unstack().to_frame().dropna().T
输出:
Col1 Col2 Col3
fvalue lvalue mean mean
0 1.0 4.0 6.5 10.5
让我们看看使用自定义功能而不使用groupby会有所帮助:
def fvalue(x):
return x.iloc[0]
def lvalue(x):
return x.iloc[-1]
func = {col:[fvalue, lvalue] if col in group_1
else [fvalue, lvalue, 'mean'] if col in group_2
else 'mean' for col in df.columns}
df.agg(func)