pandas groupby聚合不保留数据类型

cl25kdpy  于 2023-06-20  发布在  其他
关注(0)|答案(1)|浏览(111)

请注意下面的.astype('int8')

d = pd.DataFrame({c:np.random.choice(range(10),size=20) \
                  for c in list('abcd')}).astype('int8')
d.groupby(d.columns.tolist(),as_index=False).size().info()

从而产生

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   a       20 non-null     int64
 1   b       20 non-null     int64
 2   c       20 non-null     int64
 3   d       20 non-null     int64
 4   size    20 non-null     int64
dtypes: int64(5)
memory usage: 928.0 bytes

**有没有办法让pandas保留原来的dtypes?**否则会占用太多内存。

我的pd.__version__1.3.5,与1.5.3的结果相同(但不是2.0.2作为@rickhg12hs评论!根据this answer,转换不应该发生,但这与我观察到的不一致。

t30tvxxf

t30tvxxf1#

我不认为你想groupby在这里:

samp = pd.DataFrame([[1,2,3],[2,3,4]],columns=['a','b','c'])
print(samp.groupby(samp.columns.to_list()).groups)
{(1, 2, 3): [0], (2, 3, 4): [1]}

你正在创建一个dataframe,其中索引是你的值,这只有在你试图计算每行出现的次数时才真正有用,在这种情况下,存在更好的选择:

counts = np.unique(d.values, return_counts=True, axis=0)
ret = pd.DataFrame(counts[0], columns=d.columns)
ret['size'] = counts[1].astype('int8')

一个print(ret.dtypes)将向你保证我们完全仍然在int8中。

相关问题