jojo9090 发表于 2023-10-11 16:19:04

这段代码为什么会出现警告?

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

# 筛选出物料编码以04.或05.开头的行
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 =
print(period46)

# 筛选出生产月份在period46的数据
inventory_2_46 = inventory_2.dt.month.isin(period46)]
inventory_2_46 = inventory_2_46.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.dt.year==2023]

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

哪里出错了?

isdkz 发表于 2023-10-11 16:19:31

警告的原因是因为在对一个DataFrame进行筛选时,使用了另一个DataFrame的列进行筛选,但两个DataFrame的索引不一样,导致警告。具体来说,这段代码中的inventory_2_46 = inventory_2_46.dt.year==2023],在对inventory_2_46进行筛选时,使用了inventory_2的生产日期列进行筛选,但两个DataFrame的索引不一样,因此会出现警告。解决方法是使用inventory_2_46的生产日期列进行筛选,即将代码修改为inventory_2_46 = inventory_2_46.dt.year==2023]。另外,代码中插入单价金额列的部分可以改为inventory_2[['单价', '金额']] = pd.NA,更加简洁。

陶远航 发表于 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.dt.year==2023]


这个警告是因为你在使用一个布尔系列(Boolean Series)来索引一个DataFrame,但这个布尔系列的索引和DataFrame的索引不匹配。在你的代码中,这个问题出现在这一行:

inventory_2_46 = inventory_2_46.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.dt.year==2023]


在这个修改后的代码中,inventory_2_46['生产日期'].dt.year==2023的索引就和inventory_2_46的索引是一致的,所以不会出现警告。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 2023-10-11 16:19:53

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

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


# 筛选出生产月份在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))]


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

jojo9090 发表于 2023-10-11 16:20:39

isdkz 发表于 2023-10-11 16:19
警告的原因是因为在对一个DataFrame进行筛选时,使用了另一个DataFrame的列进行筛选,但两个DataFrame的索 ...

非常感谢
页: [1]
查看完整版本: 这段代码为什么会出现警告?