Python—相同类型的数据、相同的代码,但结果不同

Python—相同类型的数据、相同的代码,但结果不同,python,csv,for-loop,Python,Csv,For Loop,如果我弄错了,我会提前道歉,但下面显示的代码和数据看起来与我相同,但会产生不同的结果。 我的数据如下所示: csv文件 1907-09-01108,13.5,7.9,20.7 1907-09-02,108,16.2,7.9,22 1907-09-03,108,16.2,13.1,21.3 1907-10-04,108,16.5,11.2,22 1907-10-05,108,17.6,10.9,25.4 1907-10-06,108,13,11.2,21.3 1907-11-07,108,11.3

如果我弄错了,我会提前道歉,但下面显示的代码和数据看起来与我相同,但会产生不同的结果。 我的数据如下所示:

csv文件
1907-09-01108,13.5,7.9,20.7
1907-09-02,108,16.2,7.9,22
1907-09-03,108,16.2,13.1,21.3
1907-10-04,108,16.5,11.2,22
1907-10-05,108,17.6,10.9,25.4
1907-10-06,108,13,11.2,21.3
1907-11-07,108,11.3,6.3,16.1
1907-11-08,108,8.9,3.9,14.9
1907-11-09,108,11.6,3.8,21.1
1907-11-10,108,14.2,6.4,24.1
1907-11-11,108,15.4,10.1,20.4
1907-12-12,108,13.9,11.1,17.4
1907-12-13,108,13.8,8.3,21.3
1907-12-14,108,13,6.1,20.6
1907-12-15,108,13.1,5.7,20.9
代码 数据集有大约40000天的数据点。使用此数据集,我尝试获取最后一列中的数据点(当天的最高温度),并根据一天中的月份将它们放入列表中的a列表中(例如,放入
all_month=[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[]、[/code>中的相应列表中,就像所有一月数据点都进入第一个嵌套列表一样)。简单地说,我试着手动执行熊猫的
groupby('month')

当我运行下面的代码时:

import csv

f = open('ta_20200826183704.csv', 'r')
data = csv.reader(f)
header = next(data)

all_month = []
month = []

for i in range(1,13):
    all_month.append(month)
    
for row in data:
    month = int(row[0].split('-')[1])
    for i in range(1,13):
        if month == i:
            all_month[i-1].append(row[-1])
输出在每个嵌套列表中具有相同的数据,这意味着最后一列中的数据点没有按月分组(即,所有这些点都放入每个嵌套列表中)

真正让我困惑的是,当我手动输入相同数据的一小部分时,我能够得到预期的结果:

test_list = [[],[],[],[],[],[],[],[],[],[],[],[]]
test_data = [['1907-09-01', '108', '13.5', '7.9', '20.7'],
['1907-09-02', '108', '16.2', '7.9', '22'],
['1907-09-03', '108', '16.2', '13.1', '21.3'],
['1907-10-04', '108', '16.5', '11.2', '22'],
['1907-10-05', '108', '17.6', '10.9', '25.4'],
['1907-10-06', '108', '13', '11.2', '21.3'],
['1907-11-07', '108', '11.3', '6.3', '16.1'],
['1907-11-08', '108', '8.9', '3.9', '14.9'],
['1907-11-09', '108', '11.6', '3.8', '21.1'],
['1907-11-10', '108', '14.2', '6.4', '24.1'],
['1907-11-11', '108', '15.4', '10.1', '20.4'],
['1907-12-12', '108', '13.9', '11.1', '17.4'],
['1907-12-13', '108', '13.8', '8.3', '21.3'],
['1907-12-14', '108', '13', '6.1', '20.6'],
['1907-12-15', '108', '13.1', '5.7', '20.9']]

for row in test_data:
    month = int(row[0].split('-')[1])
    for i in range(1,13):
        if month == i:
            test_list[i-1].append(row[-1])
输出为:

[[],
 [],
 [],
 [],
 [],
 [],
 [],
 [],
 ['20.7', '22', '21.3'],
 ['22', '25.4', '21.3'],
 ['16.1', '14.9', '21.1', '24.1', '20.4'],
 ['17.4', '21.3', '20.6', '20.9']]
我能注意到的两个代码之间的唯一区别是数据的输入(或读取)方式


如果有人能指出我做错了什么和/或为什么会产生不同的结果,我将不胜感激。

让我们看看这个代码块:

all_month = []
month = []

for i in range(1,13):
    all_month.append(month)
这会将1个列表放入
所有月份
12次;您所期望的是一个包含12个不同列表的列表,但这段代码所做的基本上是创建12个指向单个列表对象的指针。如果您使用这些指针中的任何一个,那么您正在修改或读取所有指针都通用的列表,这就是您所看到的。您可以通过调用
id()
所有月份的每个条目上查看这一点;你会看到他们都有相同的id


这里有很多解决方案,如果你使用
all\u month.append([])
那么每次你添加到
all\u month
你都会插入一个新列表。

我同意Michael的回答。但是为什么不直接使用熊猫呢

将熊猫作为pd导入
测试数据=['1907-09-01','108','13.5','7.9','20.7'],
['1907-09-02', '108', '16.2', '7.9', '22'],
['1907-09-03', '108', '16.2', '13.1', '21.3'],
['1907-10-04', '108', '16.5', '11.2', '22'],
['1907-10-05', '108', '17.6', '10.9', '25.4'],
['1907-10-06', '108', '13', '11.2', '21.3'],
['1907-11-07', '108', '11.3', '6.3', '16.1'],
['1907-11-08', '108', '8.9', '3.9', '14.9'],
['1907-11-09', '108', '11.6', '3.8', '21.1'],
['1907-11-10', '108', '14.2', '6.4', '24.1'],
['1907-11-11', '108', '15.4', '10.1', '20.4'],
['1907-12-12', '108', '13.9', '11.1', '17.4'],
['1907-12-13', '108', '13.8', '8.3', '21.3'],
['1907-12-14', '108', '13', '6.1', '20.6'],
['1907-12-15', '108', '13.1', '5.7', '20.9']]
df=pd.数据帧(测试数据)
#您可以直接从您的csv文件加载此文件
#df=pd.read\u csv(“filename.csv”)
df[0]=pd.to_datetime(df[0])
分组的\u df=df.groupby(df[0].dt.strftime('%m'))[4]。应用(列表)。排序\u值()
打印(已分组)

all_month = []
month = []

for i in range(1,13):
    all_month.append(month)