こんにちは!
テービーテックの村松です。
「言語処理100本ノック2020]」
nlp100.github.io
に挑戦中!
途中でくじけないか見守ってください・・・。
そして、皆さんも一緒に挑戦してみましょう!
本日は第2章:UNIXコマンド 15~19です!
間違い・コード改善点などありましたら教えていただけると嬉しいです。
第2章:UNIXコマンド
「popular-names.txtは,アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,popular-names.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.」
ここからはpopular-names.txtを使用して問題に取り組んでいきます。
データの読み込み
import pandas as pd # \t(水平タブ)区切り・カラム名の指定を行う(今回は該当の行がないのでNoneとして連番のカラム名) df = pd.read_csv('popular-names.txt', sep='\t', header=None) print(df.head()) ##結果 0 1 2 3 0 Mary F 7065 1880 1 Anna F 2604 1880 2 Emma F 2003 1880 3 Elizabeth F 1939 1880 4 Minnie F 1746 1880
15.末尾のN行を出力
「自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.」
#末尾N行を表示 print(df.tail(3)) ##結果 0 1 2 3 2777 Lucas M 12585 2018 2778 Mason M 12435 2018 2779 Logan M 12352 2018
tail()の使い方は14.の時のhead()と使い方は同じになります。
16.ファイルをN分割する
「自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.」
N = 3 #分割したときの要素の数を計算(切り上げ) step = - (-len(df) // N) #求めたstepを使ってdfを分割していきます。 for i in range(N): df_ans = df.iloc[i*step:(i+1)*step] df_ans.to_csv('ans_' + str(i) + '.txt', sep='\t', header=False, index=False)
出来上がった3つのファイルの中身は以下のようになりました。
#ans_0 0 1 2 3 0 Mary F 7065 1880 1 Anna F 2604 1880 2 Emma F 2003 1880 3 Elizabeth F 1939 1880 4 Minnie F 1746 1880 .. ... .. ... ... 922 Betty F 32964 1926 923 Helen F 26884 1926 924 Margaret F 23070 1926 925 Ruth F 20223 1926 926 Doris F 16298 1926 [927 rows x 4 columns] #ans_1 0 1 2 3 927 Virginia F 16162 1926 928 Mildred F 13551 1926 929 Frances F 13355 1926 930 Robert M 61130 1926 931 John M 56110 1926 ... ... .. ... ... 1849 Nicole F 15752 1972 1850 Michael M 71405 1972 1851 Christopher M 52189 1972 1852 James M 47083 1972 1853 David M 46366 1972 [927 rows x 4 columns] #ans_2 0 1 2 3 1854 John M 43181 1972 1855 Robert M 43037 1972 1856 Jason M 37446 1972 1857 Brian M 36322 1972 1858 William M 30529 1972 ... ... .. ... ... 2775 Benjamin M 13381 2018 2776 Elijah M 12886 2018 2777 Lucas M 12585 2018 2778 Mason M 12435 2018 2779 Logan M 12352 2018 [926 rows x 4 columns]
17.1列目の文字列の異なり
「1列目の文字列の種類(異なる文字列の集合)を求めよ.」
#ユニークな要素を表示します。 print(df[0].unique()) ##結果 ['Mary' 'Anna' 'Emma' 'Elizabeth' 'Minnie' 'Margaret' 'Ida' 'Alice' 'Bertha' 'Sarah' 'John' 'William' 'James' 'Charles' 'George' 'Frank' 'Joseph' 'Thomas' 'Henry' 'Robert' 'Annie' 'Edward' 'Clara' 'Florence' 'Ethel' 'Bessie' 'Harry' 'Helen' 'Ruth' 'Marie' 'Lillian' 'Mildred' 'Dorothy' 'Frances' 'Walter' 'Evelyn' 'Virginia' 'Richard' 'Betty' 'Donald' 'Doris' 'Shirley' 'Barbara' 'Patricia' 'Joan' 'Nancy' 'Carol' 'David' 'Ronald' 'Judith' 'Linda' 'Sandra' 'Carolyn' 'Sharon' 'Michael' 'Susan' 'Donna' 'Larry' 'Kathleen' 'Deborah' 'Gary' 'Karen' 'Debra' 'Pamela' 'Cynthia' 'Mark' 'Steven' 'Lisa' 'Jeffrey' 'Lori' 'Kimberly' 'Tammy' 'Angela' 'Michelle' 'Jennifer' 'Melissa' 'Christopher' 'Brian' 'Amy' 'Laura' 'Tracy' 'Julie' 'Jason' 'Scott' 'Stephanie' 'Heather' 'Nicole' 'Matthew' 'Rebecca' 'Jessica' 'Amanda' 'Daniel' 'Kelly' 'Joshua' 'Crystal' 'Ashley' 'Megan' 'Brittany' 'Andrew' 'Justin' 'Samantha' 'Lauren' 'Emily' 'Brandon' 'Tyler' 'Taylor' 'Nicholas' 'Jacob' 'Hannah' 'Austin' 'Alexis' 'Rachel' 'Madison' 'Abigail' 'Olivia' 'Ethan' 'Anthony' 'Isabella' 'Ava' 'Sophia' 'Chloe' 'Alexander' 'Mia' 'Jayden' 'Noah' 'Aiden' 'Mason' 'Liam' 'Charlotte' 'Harper' 'Benjamin' 'Elijah' 'Amelia' 'Logan' 'Oliver' 'Lucas']
unique()の使い方は以前こちらでもご紹介しましたね。
18.各行を3コラム目の数値の降順にソート
「各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).」
#3行目df[2]でソートsort_values()します。 #引数は(ソートしたい列名, 降順指定) df_sort = df.sort_values(2, ascending=False) print(df_sort) ##結果 0 1 2 3 1340 Linda F 99689 1947 1360 Linda F 96211 1948 1350 James M 94757 1947 1550 Michael M 92704 1957 1351 Robert M 91640 1947 ... ... .. ... ... 27 Annie F 1326 1881 28 Bertha F 1324 1881 8 Bertha F 1320 1880 29 Alice F 1308 1881 9 Sarah F 1288 1880 [2780 rows x 4 columns]
19.各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
「各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.」
#ユニークな要素の出現回数をvalue_counts()で求めます。 df_vc = df[0].value_counts() print(df_vc) ##結果 James 118 William 111 Robert 108 John 108 Mary 92 ... Carolyn 1 Walter 1 Tracy 1 Scott 1 Pamela 1 Name: 0, Length: 136, dtype: int64
ここまでご覧いただきありがとうございます。
以上、第2章15~19でした!