如何将csv文件中的数据保存到阵列?

2024-10-03 23:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用csv模块读取csv文件。这是我的密码:

import csv

with open('test.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter='|')
    daymoment = [row[0] for row in csv.reader(csvfile, delimiter='|') if row != ''][1::]
    day = [row[0] for row in spamreader]
print(daymoment)
print(day)

这是我的csv文件:

|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday
Morning|2|1|1|3|5|6|7
Afternoon|3|4|4|7|8|6|5
Evening|5|23|5|6|8|7|9
Night|6|1|4|2|6|4|7

但是我有以下问题:day中没有值。例如,我想要['Monday', '2', '3', '5', '6']

你能帮我吗

谢谢大家!


Tags: 模块文件csvcsvfilein密码forreader
2条回答

csv阅读器逐行读取文件。当到达文件末尾时,读取器已耗尽,将不再返回任何内容。如果要多次处理,必须将行保留在数据结构中,例如列表:

with io.StringIO(t) as csvfile:
    spamreader = list(csv.reader(csvfile, delimiter='|'))
    daymoment = [row[0] for row in spamreader if row[0] != ''][1::]
    day = [row[1] for row in spamreader]

print(day)
print(daymoment)

给出:

['Monday', '2', '3', '5', '6']
['Afternoon', 'Evening', 'Night']

对于您的CSV文件,我修复了“午后”的一个拼写错误,并根据您的代码添加了一个新的专栏标题“daymoment”

Daymoment|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday
Morning|2|1|1|3|5|6|7
Afternoon|3|4|4|7|8|6|5
Evening|5|23|5|6|8|7|9
Night|6|1|4|2|6|4|7

您可以读入csv文件,将其转换为熊猫数据帧,然后读取“周一”列以获得如下数据:

import csv
import pandasql as ps
import pandas as pd

with open('test.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter='|')
    mydata = pd.DataFrame([x for x in spamreader])
    mydata.columns = mydata.iloc[0]
    mydata = mydata[1:]

print(mydata['Monday'])  
1    2
2    3
3    5
4    6  

如果我理解正确,您可能希望从数据中选择各个日期,并在不同的结构中获取它们的值。这需要使用sql(上面导入的)进行数据转换,如下所示:

transform_sql = """
select
Daymoment,
'Monday' as Day,
Monday as Daycount
from mydata
union all
select
Daymoment,
'Tuesday' as Day,
Tuesday as Daycount
from mydata
union all
select
Daymoment,
'Wednesday' as Day,
Wednesday as Daycount
from mydata
union all
select
Daymoment,
'Thursday' as Day,
Thursday as Daycount
from mydata
union all
select
Daymoment,
'Friday' as Day,
Friday as Daycount
from mydata
union all
select
Daymoment,
'Saturday' as Day,
Saturday as Daycount
from mydata
union all
select
Daymoment,
'Sunday' as Day,
Sunday as Daycount
from mydata
"""

print(ps.sqldf(transform_sql))  
    Daymoment        Day Daycount
0     Morning     Monday        2
1   Afternoon     Monday        3
2     Evening     Monday        5
3       Night     Monday        6
4     Morning    Tuesday        1
5   Afternoon    Tuesday        4
6     Evening    Tuesday       23
7       Night    Tuesday        1
8     Morning  Wednesday        1
9   Afternoon  Wednesday        4
10    Evening  Wednesday        5
11      Night  Wednesday        4
12    Morning   Thursday        3
13  Afternoon   Thursday        7
14    Evening   Thursday        6
15      Night   Thursday        2
16    Morning     Friday        5
17  Afternoon     Friday        8
18    Evening     Friday        8
19      Night     Friday        6
20    Morning   Saturday        6
21  Afternoon   Saturday        6
22    Evening   Saturday        7
23      Night   Saturday        4
24    Morning     Sunday        7
25  Afternoon     Sunday        5
26    Evening     Sunday        9
27      Night     Sunday        7  

现在,您只需从转换后的数据结构中选择所需的“日期”

print(transposed_data.loc[transposed_data['Day'] == 'Monday'])  
   Daymoment     Day Daycount
0    Morning  Monday        2
1  Afternoon  Monday        3
2    Evening  Monday        5
3      Night  Monday        6

相关问题 更多 >