テービーテックのデータサイエンス

未経験リケジョがゼロからデータサイエンティストを目指す姿を記す奮闘記です。2019/12/05文系出身者が共同で更新を開始

TAG index

▲心くじけず言語処理100本ノック==15~19==

f:id:TBT_matsu:20200515145048p:plain
こんにちは!
テービーテックの村松です。

「言語処理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でした!