频率分配 - Python - 从 CSV 导入



我正在尝试导入一个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 行 x 2 列]2
2
行。
如您所见,跳过了一些值。并制作了另外三列。
同样,应该只有 100 行,因为第一行是标题。bach(学士)和mast(硕士)的长度都应该是 100,而不是 2。

任何帮助都非常感谢。

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

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

也许您可以解释一下您要从数据帧中获取什么?

实际上我不太清楚你想要实现什么(你应该整理你的代码;)

您正在删除所有换行符并在第一行(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...

最新更新