我正在尝试导入一个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 行 x 2 列]2
2
行。
如您所见,跳过了一些值。并制作了另外三列。
同样,应该只有 100 行,因为第一行是标题。bach
(学士)和mast
(硕士)的长度都应该是 100,而不是 2。
任何帮助都非常感谢。
对于初学者来说,当您以f
方式打开文件时,没有任何反应。我猜这是早期尝试的一些残余代码。此外,如果您的 CSV 文件已经具有所需的标题,则可以省略read_csv上的header=None, names=["Bachelor's", "Master's"]
参数。第三,您的学位列表中缺少SBS
。
我不知道你在 for 循环中做什么,因为bach
和mast
都是空列表,这里不应该评估任何内容。
也许您可以解释一下您要从数据帧中获取什么?
实际上我不太清楚你想要实现什么(你应该整理你的代码;)
您正在删除所有换行符并在第一行(data=f.read().replace('n','')
)中创建一长行,我猜这是为了删除空行。使用 s.th。就像x.replace('nn','n')
一样。但最终你实际上并没有使用data
并继续使用pd.read_csv()
。
如果你决定使用data
你可以做 s.th 喜欢。
data = f.read().replace('nn','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-级联替换
if x=='B':
b_b.append(x)
elif x=='CSE':
b_cse.append(x)
etc...