鱼C论坛

 找回密码
 立即注册
查看: 1808|回复: 10

[已解决]为什么会不按照循环走

[复制链接]
发表于 2023-8-10 16:27:14 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 AdiosSpike 于 2023-8-10 16:31 编辑

悲伤不能附件excel
# 导入库
import pandas as pd
import numpy as np
import math
pd.set_option('display.unicode.east_asian_width', True)  # 设置输出右对齐,此代码写入脚本中
#导入数据
df = pd.DataFrame(pd.read_csv('2022_APMCM_C_Data.csv',encoding='gb18030'))
df = df.fillna(0)
nianbot=df["年"].min()
niantop=df["年"].max()
temper = []
for i in range(nianbot,niantop+1):
    for j in range(1,13):
        position = (df["AverageTemperature"]!=0).tolist()and(df["年"]==i).tolist()and(df["月"]==j).tolist()
        temper.append(np.mean(df["AverageTemperature"][position]))
        print(i,j)
temper = pd.DataFrame({"平均温度":np.array(temper)})
temper.to_excel("平均温度.xlsx")

如何我发现结果不对,如何开始debug

j居然到了1745
这是怎么了
最佳答案
2023-8-10 16:27:15
AdiosSpike 发表于 2023-8-10 16:35
来个正常的人回复我就把正确答案给他


and运算符只能用于比较两个布尔值,而不是两个列表。如果您想要得到两个列表的逻辑与,您应该使用numpy库中的logical_and函数。
例如,如果您想要得到df[“AverageTemperature”]不等于0且df[“年”]等于i且df[“月”]等于j的位置,您应该这样写:
position = np.logical_and(np.logical_and(df[“AverageTemperature”]!=0, df[“年”]==i), df[“月”]==j)
这样,position就是一个布尔值列表,表示每一行是否满足这三个条件。然后,您就可以用它来筛选df[“AverageTemperature”]的值,并计算平均温度。

最佳答案

查看完整内容

and运算符只能用于比较两个布尔值,而不是两个列表。如果您想要得到两个列表的逻辑与,您应该使用numpy库中的logical_and函数。 例如,如果您想要得到df[“AverageTemperature”]不等于0且df[“年”]等于i且df[“月”]等于j的位置,您应该这样写: 这样,position就是一个布尔值列表,表示每一行是否满足这三个条件。然后,您就可以用它来筛选df[“AverageTemperature”]的值,并计算平均温度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-10 16:27:15 | 显示全部楼层    本楼为最佳答案   
AdiosSpike 发表于 2023-8-10 16:35
来个正常的人回复我就把正确答案给他


and运算符只能用于比较两个布尔值,而不是两个列表。如果您想要得到两个列表的逻辑与,您应该使用numpy库中的logical_and函数。
例如,如果您想要得到df[“AverageTemperature”]不等于0且df[“年”]等于i且df[“月”]等于j的位置,您应该这样写:
position = np.logical_and(np.logical_and(df[“AverageTemperature”]!=0, df[“年”]==i), df[“月”]==j)
这样,position就是一个布尔值列表,表示每一行是否满足这三个条件。然后,您就可以用它来筛选df[“AverageTemperature”]的值,并计算平均温度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-10 16:27:30 | 显示全部楼层
根据你提供的代码,有几个原因可能导致循环不按预期运行:

1. 数据问题:请确保你的输入数据文件 "2022_APMCM_C_Data.csv" 中的数据是正确的,没有任何格式问题或者缺失值。你可以尝试打印出读取到的数据来检查它们是否符合预期。
print(df.head())  # 打印前几行数据来检查

2. 循环条件问题:循环中使用了多个条件进行索引,确保这些条件的逻辑运算是正确的。根据你的代码,对于每个月份,只有当 "AverageTemperature" 不等于0、"年" 等于当前循环的年份、"月" 等于当前循环的月份时,才会计算平均温度。你可以在循环中添加一行输出语句,打印每次循环的年份和月份,以便检查是否符合预期。
for i in range(nianbot, niantop + 1):
    for j in range(1, 13):
        position = (df["AverageTemperature"] != 0).tolist() and (df["年"] == i).tolist() and (df["月"] == j).tolist()
        print(i, j)  # 打印每次循环的年份和月份
        temper.append(np.mean(df["AverageTemperature"][position]))

3. 数据类型问题:确保 "年" 和 "月" 列的数据类型是整数,而不是字符串或其他类型。你可以使用以下代码将它们转换为整数类型:
df["年"] = df["年"].astype(int)
df["月"] = df["月"].astype(int)

尝试以上几点后,重新运行代码并检查输出结果,看是否能够解决循环不按预期运行的问题。如果问题仍然存在,可以提供更多的信息和错误提示,以便进一步调试和帮助你解决问题。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-10 16:27:37 | 显示全部楼层
在你的代码中,循环变量 j 的取值范围是从1到12,但是你的数据集中的月份可能不是连续的。因此,当 j 的值超过数据集中存在的最大月份时,循环不会停止,而是继续增加,直到达到12。这就导致了 j 的值变得很大,比如1745。

为了解决这个问题,你可以通过获取数据集中的最大月份来设置循环变量 j 的取值范围。你可以使用 df['月'].max() 来获取最大月份,然后将其作为 range() 函数的参数。

修改后的代码如下:
import pandas as pd
import numpy as np

pd.set_option('display.unicode.east_asian_width', True)

df = pd.DataFrame(pd.read_csv('2022_APMCM_C_Data.csv', encoding='gb18030'))
df = df.fillna(0)
nianbot = df["年"].min()
niantop = df["年"].max()
temper = []

for i in range(nianbot, niantop + 1):
    for j in range(1, df['月'].max() + 1):
        position = (df["AverageTemperature"] != 0).tolist() and (df["年"] == i).tolist() and (df["月"] == j).tolist()
        temper.append(np.mean(df["AverageTemperature"][position]))
        print(i, j)

temper = pd.DataFrame({"平均温度": np.array(temper)})
temper.to_excel("平均温度.xlsx")

通过这种方式,循环变量 j 将根据数据集中的最大月份进行循环,避免了超出范围的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 16:29:23 | 显示全部楼层
怎么都是chatgpt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 16:30:51 | 显示全部楼层
怎么发图片
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 16:34:59 | 显示全部楼层
我发现我把i改成ii就解决了,应该是程序bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 16:35:36 | 显示全部楼层
来个正常的人回复我就把正确答案给他
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 16:37:21 | 显示全部楼层
不对好像没解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-10 16:56:42 | 显示全部楼层
AdiosSpike 发表于 2023-8-10 16:35
来个正常的人回复我就把正确答案给他


我是正常人!!!!!!!!!给我给我给我!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-8-10 19:21:10 | 显示全部楼层
学习编程中的Ben 发表于 2023-8-10 16:56
我是正常人!!!!!!!!!给我给我给我!!!

乐,九楼好像比你先回复,下次一定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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