Python / Pandas-聚集具有第一个/最后一个功能的数据框而不进行分组

时间:2019-12-16 14:12:34

标签: python pandas dataframe aggregation

我正在尝试使用熊猫聚合整个数据框,而不进行任何分组。

我确实需要为不同的列使用不同的函数,所以我使用的是字典,但是将“ 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函数一样,不应删除任何空值/列。

1 个答案:

答案 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)