AdiosSpike 发表于 2023-8-10 16:27:14

为什么会不按照循环走

本帖最后由 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"]))
      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”]的值,并计算平均温度。

陶远航 发表于 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"]))


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

df["年"] = df["年"].astype(int)
df["月"] = df["月"].astype(int)


尝试以上几点后,重新运行代码并检查输出结果,看是否能够解决循环不按预期运行的问题。如果问题仍然存在,可以提供更多的信息和错误提示,以便进一步调试和帮助你解决问题。
如果问题已经解决,请设置最佳答案

isdkz 发表于 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"]))
      print(i, j)

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


通过这种方式,循环变量 j 将根据数据集中的最大月份进行循环,避免了超出范围的问题。

AdiosSpike 发表于 2023-8-10 16:29:23

怎么都是chatgpt

AdiosSpike 发表于 2023-8-10 16:30:51

怎么发图片

AdiosSpike 发表于 2023-8-10 16:34:59

我发现我把i改成ii就解决了,应该是程序bug

AdiosSpike 发表于 2023-8-10 16:35:36

来个正常的人回复我就把正确答案给他

AdiosSpike 发表于 2023-8-10 16:37:21

不对好像没解决

学习编程中的Ben 发表于 2023-8-10 16:56:42

AdiosSpike 发表于 2023-8-10 16:35
来个正常的人回复我就把正确答案给他

我是正常人!!!!!!!!!给我给我给我!!!

AdiosSpike 发表于 2023-8-10 19:21:10

学习编程中的Ben 发表于 2023-8-10 16:56
我是正常人!!!!!!!!!给我给我给我!!!

乐,九楼好像比你先回复,下次一定{:5_110:}
页: [1]
查看完整版本: 为什么会不按照循环走