鱼C论坛

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

[已解决]这段代码为什么会出现警告?

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

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

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

x
本帖最后由 jojo9090 于 2023-10-11 16:21 编辑
import pandas as pd
import datetime as dt




# 以第二行为表头
inventory_2 = pd.read_excel(r'C:\Users\Administrator\Desktop\python\普通盘点管理2023101011.xlsx', usecols=lambda x: True,header=1)

# 删除盘点数量为0的行
inventory_2 = inventory_2[inventory_2['盘点数量'] != 0]
# 删除不需要的列并重新对列排序
inventory_2.drop(columns=['账簿', '盘点单号', '仓 库', '单据状态','结存数量', '明细条数', '录入员', '录入日期', '审核员', '审核日期'], inplace=True)
new_col_order=['产品编码', '产品名称', '规格型号', '颜色', '盘点数量', '盘号', '生产日期']
inventory_2=inventory_2[new_col_order]
# 插入单价金额列
inventory_2.insert(5, column='单价', value=pd.NA)
inventory_2.insert(6, column='金额', value=pd.NA)

# 筛选出物料编码以04.或05.开头的行
inventory_2 = inventory_2[inventory_2['产品编码'].str.startswith('04.') | inventory_2['产品编码'].str.startswith('05.')]
print(inventory_2.head())

# 创建今天的日期,提取月份
current_month = dt.datetime.now().month
print('这个月的月份是',current_month)

#(1)筛选4-6个月
# 4-6个月前的月份
period46 = [date for date in range(current_month-7,current_month-4)]
print(period46)

# 筛选出生产月份在period46的数据
inventory_2_46 = inventory_2[inventory_2['生产日期'].dt.month.isin(period46)]
inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023]
# 筛选出来的数据按编码排序
inventory_2_46.sort_values(by='产品编码')


# (2)半年以上数据
# 算出半年时间点的月份
period6 = current_month-7
# 筛选出半年以上的行
inventory_2_6 = inventory_2[((inventory_2['生产日期'].dt.year == 2023) & (inventory_2['生产日期'].dt.month < period6) | (inventory_2['生产日期'].dt.year < 2023) & (inventory_2['生产日期'].dt.month < 13))]
# 筛选出来的数据按编码排序
inventory_2_6.sort_values(by='产品编码')


# 创建一个新的工作表并写入筛选出来的数据(4-6月和半年)
filtered_sheet = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\python\普通盘点管理2023101011.xlsx', engine='openpyxl', mode='a')
inventory_2_46.to_excel(filtered_sheet, sheet_name='4-6', index=False)
inventory_2_6.to_excel(filtered_sheet, sheet_name='半年', index=False)
filtered_sheet._save()


运行后出现如下警告
D:\pythonProject\costing report\longterm overstock.py:38: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023]

本来没有警告,我添加了这一小段代码后,就出现警告了
# 删除不需要的列并重新对列排序
inventory_2.drop(columns=['账簿', '盘点单号', '仓 库', '单据状态','结存数量', '明细条数', '录入员', '录入日期', '审核员', '审核日期'], inplace=True)
new_col_order=['产品编码', '产品名称', '规格型号', '颜色', '盘点数量', '盘号', '生产日期']
inventory_2=inventory_2[new_col_order]
# 插入单价金额列
inventory_2.insert(5, column='单价', value=pd.NA)
inventory_2.insert(6, column='金额', value=pd.NA)

哪里出错了?
最佳答案
2023-10-11 16:19:31
警告的原因是因为在对一个DataFrame进行筛选时,使用了另一个DataFrame的列进行筛选,但两个DataFrame的索引不一样,导致警告。具体来说,这段代码中的inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023],在对inventory_2_46进行筛选时,使用了inventory_2的生产日期列进行筛选,但两个DataFrame的索引不一样,因此会出现警告。解决方法是使用inventory_2_46的生产日期列进行筛选,即将代码修改为inventory_2_46 = inventory_2_46[inventory_2_46['生产日期'].dt.year==2023]。另外,代码中插入单价金额列的部分可以改为inventory_2[['单价', '金额']] = pd.NA,更加简洁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 16:19:31 | 显示全部楼层    本楼为最佳答案   
警告的原因是因为在对一个DataFrame进行筛选时,使用了另一个DataFrame的列进行筛选,但两个DataFrame的索引不一样,导致警告。具体来说,这段代码中的inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023],在对inventory_2_46进行筛选时,使用了inventory_2的生产日期列进行筛选,但两个DataFrame的索引不一样,因此会出现警告。解决方法是使用inventory_2_46的生产日期列进行筛选,即将代码修改为inventory_2_46 = inventory_2_46[inventory_2_46['生产日期'].dt.year==2023]。另外,代码中插入单价金额列的部分可以改为inventory_2[['单价', '金额']] = pd.NA,更加简洁。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 16:19:45 | 显示全部楼层
你的警告信息是这样的:
D:\\pythonProject\\costing report\\longterm overstock.py:38: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
  inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023]

这个警告是因为你在使用一个布尔系列(Boolean Series)来索引一个DataFrame,但这个布尔系列的索引和DataFrame的索引不匹配。在你的代码中,这个问题出现在这一行:
inventory_2_46 = inventory_2_46[inventory_2['生产日期'].dt.year==2023]

在这一行,你试图使用inventory_2['生产日期'].dt.year==2023这个布尔系列来索引inventory_2_46这个DataFrame。然而,inventory_2['生产日期'].dt.year==2023的索引是基于inventory_2的,而不是inventory_2_46的。因此,Pandas会尝试重新索引这个布尔系列以匹配inventory_2_46的索引,这就导致了你看到的警告。

为了解决这个问题,你应该确保你的布尔系列的索引和你要索引的DataFrame的索引是一致的。你可以这样修改你的代码:
inventory_2_46 = inventory_2_46[inventory_2_46['生产日期'].dt.year==2023]

在这个修改后的代码中,inventory_2_46['生产日期'].dt.year==2023的索引就和inventory_2_46的索引是一致的,所以不会出现警告。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 16:19:53 | 显示全部楼层
警告信息是因为代码中使用了两个DataFrame的不同列进行了条件筛选,导致数据索引的不匹配。具体地,在第38行代码中,inventory_2['生产日期'].dt.year==2023返回一个Boolean Series,作为索引使用时会重新索引以匹配'inventory_2_46'的索引,但是这个条件索引是基于inventory_2的,所以会出现警告。

解决方法是将筛选条件拆分成两个步骤,在第一步中将条件放在圆括号里,使用&|连接多个条件,第二步再对Dataframe进行索引操作。修改代码如下:

[/code]
# 筛选出生产月份在period46的数据
inventory_2_46 = inventory_2[(inventory_2['生产日期'].dt.month.isin(period46)) & (inventory_2['生产日期'].dt.year==2023)]

# 筛选出半年以上的行
inventory_2_6 = inventory_2[((inventory_2['生产日期'].dt.year == 2023) & (inventory_2['生产日期'].dt.month < period6)) | ((inventory_2['生产日期'].dt.year < 2023) & (inventory_2['生产日期'].dt.month < 13))]
[/code]

另外,建议将代码中的注释加上#号,这样可以更好地区分注释和代码。同时,格式化输出,保证代码的可读性。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-11 16:20:39 | 显示全部楼层
isdkz 发表于 2023-10-11 16:19
警告的原因是因为在对一个DataFrame进行筛选时,使用了另一个DataFrame的列进行筛选,但两个DataFrame的索 ...

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-25 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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