频率分配 - Python - 从CSV导入

时间:2017-10-05 22:15:21

标签: python csv import multiple-columns

我正在尝试导入csv文件,此文件有两列:Bachelor'sMaster'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.

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

对于初学者,当您以f打开文件时,不会发生任何事情。我猜测这是早期尝试的一些残留代码。此外,如果您的CSV文件已经具有所需的标题标题,则可以省略read_csv上的header=None, names=["Bachelor's", "Master's"]参数。第三,学位列表中缺少SBS

我不知道你在for循环中做了什么,因为bachmast都是空列表,这里不应该评估任何内容。

也许您可以解释一下您尝试从数据框中获得的内容?

答案 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-cascade
if x=='B':
  b_b.append(x)
elif x=='CSE':
  b_cse.append(x)
etc...