2017-10-05 8 views
1

私はCSVファイルをインポートしようとしていますが、このファイルにはBachelor'sMaster'sという2つの列があります。学生レベル(学士号または修士号)と専攻(例:ビジネス)の両方を表す文字列に、それぞれのメジャーを割り当てたいと思います。周波数分布 - Python - CSVからのインポート

このCSVファイルは、形式で書かれている:

Bachelor's Master's 

SBS   O 
H   O 
H   0 
H   O 

... ...

これは、2つの別々の列から作られています。 は、私が使用している次のコードを持っている:

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列]
行。
ご覧のとおり、一部の値はスキップされています。そして3つの他のコラムが作られました。
また、最初の行がヘッダーであったため、わずか100行にする必要があります。 bach(学士)とmast(修士)の両方の長さは100でなく2でなければなりません。

助けを喜んでいただきました。

答えて

0

最初に、fとしてファイルを開いても何も起こりません。私はこれが以前の試みからの痕跡のあるコードだと推測しています。また、CSVファイルに必要なヘッダータイトルが既にある場合は、read_csvの引数header=None, names=["Bachelor's", "Master's"]を省略できます。第3に、度数リストにSBSがありません。

bachmastはどちらも空リストであり、ここで評価する必要はないため、forループで何をしているのか分かりません。

データフレームから何を得ようとしているのか説明できますか?

は、すべての改行文字を削除し、あなたの最初の行(data=f.read().replace('\n','')、ここで一つの長い列を作成している - ;(あなたのコードを片付ける必要があります)

0

は、実際に、それはあなたが達成したいものを私に非常に明確ではありません代わりにx.replace('\n\n','\n')ようs.th.使用し、空行を削除するためのものですしかし、最終的にはあなたが実際にdataを使用していないとpd.read_csv()で起こって

あなたがdataを使用することを決定した場合は、Sを行うことができます - 。私は推測します。 .th。のように

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)):の反復はfalseです。range()によって返された整数のリストを反復処理しています(print(range(5))でどうなるか見てください)。 あなたがしたいことはfor x in mast:としてmastは既にリストです(bachと同じです)。

if x=='B':を使用するとどうなりますか?あなたはその扱いにくいlist Majorを取り除くでしょう。また、if-cascadeをif-cascadeと置き換えます。

if x=='B': 
    b_b.append(x) 
elif x=='CSE': 
    b_cse.append(x) 
etc...