Python 実践 データ加工/可視化 100本ノック に挑戦 ノック6

ノック6:繰り返し処理で新しいデータを追加しよう

 

dataフォルダにどのようなファイルがあるか確認します。

import os
list=os.listdir('data')

print(list)

 

実行結果

['22_shizuoka_all_20210331.csv', 'diff_20210401.csv', 'diff_20210405.csv', 'diff_20210406.csv', 'diff_20210407.csv', 'diff_20210408.csv', 'diff_20210409.csv', 
'mst_closeCause.csv', 'mst_column_name.txt', 'mst_corp_kind.csv', 'mst_correct_kbn.csv', 'mst_hihyoji.csv', 'mst_latest.csv', 'mst_process_kbn.csv']

 

diff*.csvファイルのみをリスト表示するため、globライブラリを読み込みパターンマッチを行います。

import os
from glob import glob
list=os.listdir('data')
list2=glob('data/diff*.csv')
print(list2)

 

実行結果

['data\\diff_20210401.csv', 'data\\diff_20210405.csv', 'data\\diff_20210406.csv', 'data\\diff_20210407.csv', 'data\\diff_20210408.csv', 'data\\diff_20210409.csv']

 

本の内容では、ここでファイルリストをソートしていますが、私の環境ではすでにリストはソートされた状態で表示されました。(Python 3.8.5)

 

リストの最初のファイルを読み込みます。

import os
from glob import glob
import pandas as pd

list=os.listdir('data')
list2=glob('data/diff*.csv')
diff=pd.read_csv(list2[0],encoding='shift-jis',header=None,dtype=object)

print(len(list2))
print(diff.head(5))

 

実行結果

6

0              1   2  3           4           5                   6    7   ...          22 23   24   25   26   27               28 29
0  1  1010001016019  71  0  2021-04-01  2021-03-01         株式会社国際漢方研究所  NaN  ...  2015-10-05  1  NaN  NaN  NaN  NaN  コクサイカンポウケンキュウショ 
 0
1  2  1010001092869  01  1  2021-04-01  2020-06-11  あさひ銀リテールファイナンス株式会社  NaN  ...  2020-06-11  0  NaN  NaN  NaN  NaN  アサヒギンリテールファイ
ナンス  0
2  3  1010001092869  21  0  2021-04-01  2021-03-22  あさひ銀リテールファイナンス株式会社  NaN  ...  2020-06-11  1  NaN  NaN  NaN  NaN  アサヒギンリテールファイ
ナンス  0
3  4  1010001128061  01  1  2021-04-01  2015-10-05      日本アイ・ビー・エム株式会社  NaN  ...  2015-10-05  0  NaN  NaN  NaN  NaN        ニホンアイビーエム  0 
4  5  1010001128061  71  1  2021-04-01  2017-10-02      日本アイ・ビー・エム株式会社  NaN  ...  2015-10-05  1  NaN  NaN  NaN  NaN        ニホンアイビーエム  0

 

 

csvファイルのprefectureName項目が静岡県である場合のみを抽出します。データを絞り込むにはpanasのlocを使用します。

 

import os
from glob import glob
import pandas as pd

list=os.listdir('data')
list2=glob('data/diff*.csv')
diff=pd.read_csv(list2[0],encoding='shift-jis',header=None,dtype=object)


mst=pd.read_csv('data/mst_column_name.txt',encoding='shift-jis',sep='\t')
columns = mst.column_name_en.values
diff.columns=columns

diff=diff.loc[diff['prefectureName']=='静岡県']
print(len(diff))
print(diff.head(3))

 

実行結果

43
    sequenceNumber corporateNumber process correct  updateDate  changeDate  ... enName enPrefectureName enCityName enAddressOutside   furigana hihyoji
107            108   1080001015906      01       1  2021-04-01  2015-10-05  ...    NaN              NaN        NaN              NaN    エムケイテック       0  
108            109   1080001015906      12       1  2021-04-01  2021-03-30  ...    NaN              NaN        NaN              NaN    エムケイテック       0  
109            110   1080002015434      01       1  2021-04-01  2015-10-05  ...    NaN              NaN        NaN              NaN  ハイナンディーシー       0

 

データの結合手順

1.テスト用の変数にdataの中身をコピー

2.既存の件数を確認

3.既存の件数が正しいことを確認

4.差分の件数を確認

5.追加後の件数を確認

6.追加後のデータの末尾3件を確認

 

data = pd.read_csv('data/22_shizuoka_all_20210331.csv',
                    encoding='shift-jis',header=None,dtype=object)
data_test=data
print(len(data_test))
print(len(data_test)==len(data))
print(len(diff))
data_test = data_test.append(diff)
print(len(data_test))
print(data_test.tail(3))

 

実行結果

114613
True
43
114656
     sequenceNumber corporateNumber process correct  updateDate  changeDate  ... enName enPrefectureName enCityName enAddressOutside   furigana hihyoji
2159           2160   9080401024929      01       0  2021-04-01  2021-04-01  ...    NaN              NaN        NaN              NaN       リガーレ       0    
2160           2161   9080402007726      01       1  2021-04-01  2015-10-05  ...    NaN              NaN        NaN              NaN  マルシンショウテン       0
2161           2162   9080402021917      21       0  2021-04-01  2021-03-30  ...    NaN              NaN        NaN              NaN  オカモトショウカイ       0

 

全てのdiff*.csvファイルから静岡県を抽出する記述は以下となります。

for fi in list2:
    diff=pd.read_csv(fi,encoding='shift-jis',header=None,dtype=object)
    diff.columns=columns
    diff=diff.loc[diff['prefectureName']=='静岡県']
    data = data.append(diff)

print(data)
print(data.describe())
 

 

実行結果

     sequenceNumber corporateNumber process correct  updateDate  

count          115020            115020      115020  115020      115020  
unique         114613            114758            6       2          1322
top               3032       7080402010509        01       0  2015-11-13
freq                 4                  5         94398   80949       55969  

 

実行結果より、uniqueでcorporateNumberの値と sequenceNumber の値が異なります。

データが重複しているためです。重複データを確認します。

 

print(data[data["corporateNumber"].duplicated()])

 

実行結果

    sequenceNumber corporateNumber process correct  updateDate  changeDate  ... enName enPrefectureName enCityName enAddressOutside     furigana hihyoji
107             108   1080001015906      01       1  2021-04-01  2015-10-05  ...    NaN              NaN        NaN              NaN      エムケイテック       
0
108             109   1080001015906      12       1  2021-04-01  2021-03-30  ...    NaN              NaN        NaN              NaN      エムケイテック       
0
109             110   1080002015434      01       1  2021-04-01  2015-10-05  ...    NaN              NaN        NaN              NaN    ハイナンディーシー     
  0
110             111   1080105005588      12       0  2021-04-01  2021-03-25  ...    NaN              NaN        NaN              NaN     レアーレワールド      
 0
113             114   1080403003401      21       0  2021-04-01  2021-03-02  ...    NaN              NaN        NaN              NaN  ポップスターインポート   
    0
...             ...             ...     ...     ...         ...         ...  ...    ...              ...        ...              ...          ...     ...      
3193           3194   9080001004208      01       1  2021-04-09  2015-10-05  ...    NaN              NaN        NaN              NaN          ハギリ       0   
3194           3195   9080001021673      01       1  2021-04-09  2017-07-07  ...    NaN              NaN        NaN              NaN          アクト       0   
3196           3197   9080102008933      01       1  2021-04-09  2015-10-05  ...    NaN              NaN        NaN              NaN     サクラキュウソウ      
 0
3197           3198   9080402002859      21       0  2021-04-09  2021-04-01  ...    NaN              NaN        NaN              NaN         コウボウ       0  
3198           3199   9080402015836      12       0  2021-04-09  2021-04-01  ...    NaN              NaN        NaN              NaN       エコワークス       0

 

重複データを削除します。keepで新しいほうを残し、既存データのほうを削除します。

inplaceでdataの中身を直接書き換えます。

data.drop_duplicates(subset='corporateNumber',keep='last',inplace=True)
print(data.describe())
 
実行結果
    sequenceNumber corporateNumber process correct  updateDate 
count          114758          114758  114758  114758      114758 
unique         114388         114758       6       2        1322  
top              3032     3080101004278      01       0  2015-11-13 
freq                4               1   94176   80781       55849  ...              231   
 
corporateNumberのcountとuniqueの値が一致(114758)しました。
/* -----codeの行番号----- */