【问题标题】:Frequency Distriution - Python - Importing From CSV频率分布 - Python - 从 CSV 导入
【发布时间】:2017-10-05 22:15:20
【问题描述】:

我正在尝试导入一个 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。

非常感谢任何帮助。

【问题讨论】:

    标签: python csv import multiple-columns


    【解决方案1】:

    对于初学者,当您以f 打开文件时,什么都没有发生。我猜这是早期尝试的一些残留代码。此外,如果您的 CSV 文件已经有您想要的标题,那么您可以省略 read_csv 上的 header=None, names=["Bachelor's", "Master's"] 参数。第三,您的学位列表中缺少SBS

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

    也许你可以解释一下你想从你的数据框中得到什么?

    【讨论】:

      【解决方案2】:

      其实我不太清楚你想要达到什么目的(你应该整理你的代码;)

      您正在删除所有换行符并在第一行中创建一个长行(data=f.read().replace('\n',''),我猜这意味着删除空行。使用 s.th. 像 x.replace('\n\n','\n') 代替。但在最后,您实际上并没有使用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...
      

      【讨论】:

        猜你喜欢
        • 2015-11-09
        • 2013-03-19
        • 1970-01-01
        • 2014-07-08
        • 2012-04-19
        • 2011-08-20
        • 2017-09-26
        • 2016-01-04
        • 2011-02-05
        相关资源
        最近更新 更多