将“skipna”参数传递给“agg”

4
我希望在使用DataFrame的agg方法时,设置skipna=False。
我的DataFrame有许多(动态)列。我正在使用groupby进行聚合,并使用agg进行聚合。
import pandas as pd
import numpy as np
df = pd.DataFrame({"A": [1, 2], "B": [np.nan, np.nan], "C": [0, 0]})

# the sum of B is 0.0
df.agg({"A": "sum", "B": "sum", "C": "max"})

当我对单列进行聚合或在整个DataFrame上使用单个聚合函数时,可以添加skipna=False使得不跳过nan值,例如df["B"].sum(skipna=False)df.sum(skipna=False)。但是由于我使用了多种不同的函数(sum, avg, max),这种方式不适用于我。

我该如何通过agg方法传递skipna参数呢?

2个回答

3

我个人会这样做:

out = pd.Series({'A': df['A'].sum(skipna=False), 
                 'B': df['B'].sum(skipna=False),
                 'C': df['C'].max()
                })

此外,使用lambda的agg也可以起作用:

df.agg({'A': lambda x: x.sum(skipna=False),
        'B': lambda x: x.sum(skipna=False),
        'C': 'max'})

2
我会定义一个别名,比如 nasum = lambda x: x.sum(skipna=False),然后在 agg 中使用它 ;) - mozway

3

如果您有很多列需要聚合,这里有另一种方法:

d = {"A": "sum", "B": "sum", "C": "max"}
pd.Series({c: getattr(df[c], f)(skipna=False) for c, f in d.items()})

A    3.0
B    NaN
C    0.0
dtype: float64

1
不错,@Shubham! - mozway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接