Pandas的GroupBy聚合操作不保留数据类型。

3
我使用Pandas的GroupByGroupby.agg函数来对我的数字列使用诸如summaxmin之类的函数进行分组聚合,但我发现之前强制指定的列数据类型(例如np.int8、np.int16、np.int32)在GroupBy聚合后未被保留,实际上每一列都被转换成了int64类型。 Pandas版本为1.1.5。
目前我的解决方案是在groupby聚合结束后重新下调数据类型。这是一个已知问题吗?是否有更好的解决方案?

1
请问你能举个例子吗?我这边保留了数据类型,但是使用的是Pandas 1.2.3版本。 - Florian Fasmeyer
请提供您的代码。如所示,使用内置函数将保留dtype,但如果出于某种原因您正在使用不必要且效率低下的lambda:.groupby(...).apply(lambda x: x.sum()),那么您将会被转换为int64 - ALollz
等等,你是不是假设他在使用lambda表达式,还是因为我用了一个lambda表达式来展示类型可以混合使用而感到混淆了? - Florian Fasmeyer
1
我正在深入研究这个问题 - 感谢您的快速反馈。 - Guido
1个回答

2

在pandas 1.1.5版本上进行测试

我得到的结果不同。数据类型被保留。

import pandas as pd
import numpy as np

df = pd.DataFrame(dict(a=[1,2,3,4,5], b=[1,2,3,4,5], c=[1,2,3,4,5]))
df = df.astype({'a': np.int8, 'b': np.int16, 'c': np.int32})
new_df = df.groupby(by='c').max()
print(new_df.dtypes)

""" Output - dtypes are conserved.
a     int8
b    int16
dtype: object
"""

你可能使用了一个聚合器,它经过了多列。如果你要聚合 a + b => 你将得到 int16

new_df = df.groupby(by='c').apply(lambda x: x['a'] + x['b'])
print(new_df.dtypes)
# Output : int16

这是我的情况,我正在通过多列使用聚合器。对于其中一些列,聚合是“平均值”,因此我始终得到浮点数,但在其他列中,我的聚合是“总和”,而基础列是int64。有没有办法防止pandas将它们转换为浮点数? - MrT77

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