首页 > 解决方案 > 在不转换为不兼容类型的情况下求和空 DataFrame

问题描述

如何对空数据框求和而不会出错?

>>> pd.DataFrame(columns=["Duration"], dtype="timedelta64[ns]").sum(skipna=False)
...
TypeError: cannot astype a timedelta from [timedelta64[ns]] to [float64]

那是因为如果数据框为空(github) ,则DataFrame.sum调用。Master 必须已更改,因为不绕过转换(是的,这是1.2.3 版本)。并且, 除非,似乎不起作用,并且只会产生奇怪的结果(我认为 NaT 被强制为一个非常负的数字)。astype(np.float64)min_countGroupBy.summin_countnumeric_only != False

现在在groupby.

df.groupby(...).apply(pd.DataFrame.sum, skipna=False)

此解决方法取决于内部 api 方法:

df.groupby(...).apply(pd.DataFrame._reduce, pd.core.nanops.nansum, "", skipna=False)

此解决方法不支持skipna

df.groupby(...).sum()

有趣的是,DataFrame.sum默认初始值为零,而GroupBy.sum默认为 NaT(另一个错误?)。DataFrame.sum没有提供任何将初始参数传递给的方法,numpy.sum而且我不知道 numpy 如何从输入类型中获取起始值。中的评论Groupby.Sum表明它默认为 NA 但我没有进一步挖掘。显然,需要更好地定义起始值。

感谢PR#40143,我可以在未来的版本中做到这一点。现在我不知道否定的行为有多固定min_count,而且我还没有测试过。

# NaT -> NaT, empty -> NaT
df.groupby(...).apply(pd.DataFrame.sum, skipna=False, min_count=1)
# NaT -> NaT, empty -> 0
df.groupby(...).apply(pd.DataFrame.sum, skipna=False, min_count=-1)
# NaT -> 0, empty -> NaT
df.groupby(...).apply(pd.DataFrame.sum, skipna=True, min_count=1)
# NaT -> 0, empty -> 0
df.groupby(...).apply(pd.DataFrame.sum, skipna=True, min_count=-1)

同时,此解决方法允许初始值的灵活性(_min_count_stat_function只是 的包装_reduce)。仅仅因为min_count被打破GroupBy.sum并不意味着min_count被打破DataFrame.sum

df.groupby(...).apply\
 ( pd.DataFrame._min_count_stat_function, "sum'", pd.core.nanops.nansum
 , skipna=False, min_count=1)

也就是说,有没有人有更好的解决方法?不依赖于内部方法的东西?就像是:

def mysum(df, **args):
  pass

df.groupby(...).apply(mysum, skipna=False, min_count=-1) # or 'initial' instead of 'min_count'

标签: pandaspandas-groupby

解决方案


推荐阅读