我正在尝试导入csv文件,此文件有两列:Bachelor's
和Master's
。我想将每个专业分配给一个代表学生水平(学士或硕士)和专业(例如商业)的字符串。
此CSV文件采用以下格式编写:
Bachelor's Master's
SBS O
H O
H 0
H O
......
这是由两个单独的列组成。 我有以下代码:
Major_Proper = ['Business', 'Computer Sciences and
Engineering','Education','Humanities','Natural Sciences and
Mathematics','Other']
Degree = {"Bachelor's":['B','CSE','E','H','NSM','O'],"Master's":['B','CSE','E','H','NSM','O']}
Major = ['B','CSE','E','H','NSM','O']
b_b = m_b = []
b_cse = m_cse = []
b_e = m_e = []
b_nsm = m_nsm = []
b_sbs = n_nsm = []
b_o = m_o = []
bach = []
mast = []
with open('Majors.csv') as f:
data = f.read().replace('\n',"")
df = pd.read_csv('Majors.csv', header=None, names=["Bachelor's", "Master's"])
for x in range(0,len(bach)):
if x == Major[0]:
b_b.append(x)
if x == Major[1]:
b_cse.append(x)
if x == Major[2]:
b_e.append(x)
if x == Major[3]:
b_nsm.append(x)
if x == Major[4]:
b_sbs.append(x)
if x == Major[5]:
b_o.append(x)
for x in range(0,len(mast)):
if x == Major[0]:
m_b.append(x)
if x == Major[1]:
m_cse.append(x)
if x == Major[2]:
m_e.append(x)
if x == Major[3]:
m_nsm.append(x)
if x == Major[4]:
m_sbs.append(x)
if x == Major[5]:
m_o.append(x)
print(df)
print(len(bach),len(mast))
我的猜测是,数据正在吐出一条长线,如下所示:
Bachelor's Master's
Bachelor's Master's NaN NaN NaN
SBS O NaN NaN NaN
H O NaN NaN NaN
B NaN NaN NaN
O NaN NaN NaN
...
[101行×2列]
2 2
行。
如您所见,跳过了一些值。另外还有三个专栏
同样,应该只有100行,因为第一行是标题。 bach
(学士学位)和mast
(硕士学位)的长度应该都是100而不是2.
非常感谢任何帮助。
答案 0 :(得分:0)
对于初学者,当您以f
打开文件时,不会发生任何事情。我猜测这是早期尝试的一些残留代码。此外,如果您的CSV文件已经具有所需的标题标题,则可以省略read_csv上的header=None, names=["Bachelor's", "Master's"]
参数。第三,学位列表中缺少SBS
。
我不知道你在for循环中做了什么,因为bach
和mast
都是空列表,这里不应该评估任何内容。
也许您可以解释一下您尝试从数据框中获得的内容?
答案 1 :(得分:0)
实际上我不太清楚你想要实现什么(你应该整理你的代码;)
您要删除所有换行符并在第一行创建一个长行(data=f.read().replace('\n','')
,我猜 - 这是为了删除空行。请使用x.replace('\n\n','\n')
之类的s.th.但最终你实际上并没有使用data
并继续使用pd.read_csv()
。
如果你决定使用data
,你可以这样做。像
data = f.read().replace('\n\n','\n')
bach=[re.split(' ',x)[0] for x in re.split('\n',data)]
mast=[re.split(' ',x)[1] for x in re.split('\n',data)]
获取每个学士和硕士专栏的清单。
您的for x in range(len(mast)):
迭代也是错误的:您正在迭代range()
返回的整数列表(看看print(range(5))
会发生什么)。
您要执行的操作是for x in mast:
,因为mast
已经是一个列表(bach
也是如此)。
仅使用if x=='B':
怎么样?你会摆脱那些笨拙的list Major
。我也会用
if x=='B':
b_b.append(x)
elif x=='CSE':
b_cse.append(x)
etc...