鱼C论坛

 找回密码
 立即注册
查看: 1431|回复: 4

[已解决]dataframe使用groupby出现以下异常

[复制链接]
发表于 2023-8-13 08:04:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import pandas as pd
buycount = pd.DataFrame([['苹果',9000],['香蕉',4000],['梨子',2000],['菠萝',3000]],columns=['种类','购入数量'])
data = [['苹果','2022-02-09',300],
        ['苹果','2022-02-25',150],
        ['苹果','2022-09-05',550],
        ['苹果','2022-09-29',154],
        ['苹果','2023-01-29',354],
        ['苹果','2023-04-19',950],
        ['菠萝','2022-09-29',250],
        ['梨子','2023-09-20',350],
        ['香蕉','2022-07-29',650],
        ['菠萝','2023-12-22',900]]
columns = ['种类','时间','卖出数量']
df1 = pd.DataFrame(data=data,columns=columns)
# print(df1)

# 将'date'列转换为日期时间类型
df1['时间'] = pd.to_datetime(df1['时间'])
# df1['时间'] = df1['时间'].dt.strftime('%Y-%m-%d')
# df1['时间'] = df1['时间'].astype(int)
# 按年份和月份分组
df1_grouped = df1.groupby([df1['时间'].dt.year, df1['时间'].dt.month]).sum()
# 打印结果
print(df1_grouped)
Traceback (most recent call last):
  File "C:\Users\K\PycharmProjects\pythonProject\666.py", line 22, in <module>
    df1_grouped = df1.groupby([df1['时间'].dt.year, df1['时间'].dt.month]).sum()
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\groupby.py", line 2263, in sum
    result = self._agg_general(
             ^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\groupby.py", line 1422, in _agg_general
    result = self._cython_agg_general(
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\groupby.py", line 1507, in _cython_agg_general
    new_mgr = data.grouped_reduce(array_func)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\internals\managers.py", line 1506, in grouped_reduce
    applied = blk.apply(func)
              ^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\internals\blocks.py", line 329, in apply
    result = func(self.values, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\groupby.py", line 1490, in array_func
    result = self.grouper._cython_operation(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\ops.py", line 959, in _cython_operation
    return cy_op.cython_operation(
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\ops.py", line 645, in cython_operation
    self._disallow_invalid_ops(dtype, is_numeric)
  File "C:\Python\Python311\Lib\site-packages\pandas\core\groupby\ops.py", line 257, in _disallow_invalid_ops
    raise TypeError(f"datetime64 type does not support {how} operations")
TypeError: datetime64 type does not support sum operations
最佳答案
2023-8-13 10:20:40
hahadaxiao 发表于 2023-8-13 08:06
pycharm还是出现一样的异常

代码是没有问题的,看看你的库版本对不对吧。实再不行重新安装下库,并指定下版本。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-13 08:04:57 | 显示全部楼层
问题原因是尝试对datetime64类型的列进行求和操作,而datetime64类型不支持求和操作。

解决方法是将需要求和的列转换为数值类型或者整数类型,然后再进行求和操作。

在这个案例中,需要将'卖出数量'列转换为整数类型,然后再进行求和操作。可以使用astype()方法将列转换为整数类型。

以下是修改后的代码:
import pandas as pd

buycount = pd.DataFrame([['苹果',9000],['香蕉',4000],['梨子',2000],['菠萝',3000]],columns=['种类','购入数量'])
data = [['苹果','2022-02-09',300],
         ['苹果','2022-02-25',150],
         ['苹果','2022-09-05',550],
         ['苹果','2022-09-29',154],
         ['苹果','2023-01-29',354],
         ['苹果','2023-04-19',950],
         ['菠萝','2022-09-29',250],
         ['梨子','2023-09-20',350],
         ['香蕉','2022-07-29',650],
         ['菠萝','2023-12-22',900]]
columns = ['种类','时间','卖出数量']
df1 = pd.DataFrame(data=data,columns=columns)

# 将'date'列转换为日期时间类型
df1['时间'] = pd.to_datetime(df1['时间'])

# 将'卖出数量'列转换为整数类型
df1['卖出数量'] = df1['卖出数量'].astype(int)

# 按年份和月份分组并求和
df1_grouped = df1.groupby([df1['时间'].dt.year, df1['时间'].dt.month]).sum()

# 打印结果
print(df1_grouped)

运行以上代码,即可得到按年份和月份分组后的求和结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-13 08:06:54 | 显示全部楼层
isdkz 发表于 2023-8-13 08:04
问题原因是尝试对datetime64类型的列进行求和操作,而datetime64类型不支持求和操作。

解决方法是将需要 ...

pycharm还是出现一样的异常
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 09:19:24 | 显示全部楼层
加多一个指定求和的数据列,即可
>>> data = [['苹果','2022-02-09',300],
        ['苹果','2022-02-25',150],
        ['苹果','2022-09-05',550],
        ['苹果','2022-09-29',154],
        ['苹果','2023-01-29',354],
        ['苹果','2023-04-19',950],
        ['菠萝','2022-09-29',250],
        ['梨子','2023-09-20',350],
        ['香蕉','2022-07-29',650],
        ['菠萝','2023-12-22',900]]
>>> columns = ['种类','时间','卖出数量']
>>> import pandas as pd
>>> df = pd.DataFrame(data, columns=columns)
>>> df
   种类          时间  卖出数量
0  苹果  2022-02-09   300
1  苹果  2022-02-25   150
2  苹果  2022-09-05   550
3  苹果  2022-09-29   154
4  苹果  2023-01-29   354
5  苹果  2023-04-19   950
6  菠萝  2022-09-29   250
7  梨子  2023-09-20   350
8  香蕉  2022-07-29   650
9  菠萝  2023-12-22   900
>>> df['时间'] = pd.to_datetime(df['时间'])
>>> df.dtypes
种类              object
时间      datetime64[ns]
卖出数量             int64
dtype: object
>>> df.groupby(df['时间'].dt.year)['卖出数量'].sum()
时间
2022    2054
2023    2554
Name: 卖出数量, dtype: int64
>>> df.groupby([df['时间'].dt.year, df['时间'].dt.month])['卖出数量'].sum()
时间    时间
2022  2     450
      7     650
      9     954
2023  1     354
      4     950
      9     350
      12    900
Name: 卖出数量, dtype: int64
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-13 10:20:40 | 显示全部楼层    本楼为最佳答案   
hahadaxiao 发表于 2023-8-13 08:06
pycharm还是出现一样的异常

代码是没有问题的,看看你的库版本对不对吧。实再不行重新安装下库,并指定下版本。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 10:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表