pandas - 在不转换为不兼容类型的情况下求和空 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_count
GroupBy.sum
min_count
numeric_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'
解决方案
推荐阅读
- python - 如何使用本地连接将 Gcloud 虚拟机连接到 Colab?
- discord.js - Discord.js 在服务器上的每个通道中创建 webhook
- facebook - 通过 API 创建的直播流的 Facebook 隐私设置
- stm32 - STM32F4 用中断从 uart 接收数据的问题
- apache-kafka - 从 StateStore 更改日志主题具体化 GlobalKTable 并使用exact_once 处理时-其他主题消费者停止工作
- java - Mapbox Android中空对象引用上的NavigationView
- java - SSL peer 错误关闭 - 阿里巴巴 OSS java SDK
- python - 逻辑与,与带有浮点数的 numpy nan 进行比较
- python - Django Rest 框架中的 OTP 验证
- php - 从 laravel 中的选项选择中获取名称和值