こんな人にオススメ
pythonを使ってcsv
ファイルを読み込みたいけどどうしたらいいの?
ということで、今回はpythonを使ったcsv
ファイルのデータ読み込みについて解説する。txt
ファイルについてもほぼほぼ同じ方法で対応可能。
ネットで検索すると腐るほどの記事があるが、なかなか複数種類の方法が書かれているものがない印象。なら作ればいいということで自分のためにも作成。
ちなみに執筆者がpythonを始めるきっかけになったのがcsv
ファイルの読み込み。
pythonを使用する前まではExcelでゴリゴリ解析していたが重すぎてストレスになった。研究室で既にpythonの存在については紹介はされていたので独学で勉強。
調べて試しての繰り返しでなんとか読み込みができ、それからどんどんとpythonの沼に入った。
執筆者の半生とpythonの独学については以下参照。
-
-
【M天パ(めがてんぱ)自己紹介】変わって楽しいの繰り返し
続きを見る
-
-
【python&独学】独学である程度pythonを習得するマインド
続きを見る
python環境は以下。
- Python 3.9.4
- numpy 1.20.3
- pandas 1.2.4
データそのものとデータ読み込みの種類
まずは今回使用するcsv
ファイルと、データ読み込みの種類について解説する。
使用するデータ
まずは今回使用するcsv
ファイルを以下に示す。
row | column1 | column2 | column3 | column4 | column5 | column6 | column7 | column8 | column9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
2 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
3 | 31 | 33 | 34 | 35 | 36 | 37 | 39 | ||
4 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 49 | |
5 | 51 | 52 | 53 | 54 | 56 | 57 | 58 | 59 | |
6 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 |
7 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 |
row
列がインデックスとして指定したい列で、column
と名のつく列がそれぞれのデータ列と解釈していただきたい。
column
は基本的に左から右へ、下から上へ進むにつれて数値が大きくなるデータだが、一部のデータを削除して穴あきにしている。この穴あきがあるだけでデータの扱いが面倒になる。
データ読み込みの種類
pythonでは様々な方法でcsv
ファイルを読み込むことが可能。以下にその一部を抜粋する。これらはメジャーな方法。
open
read()
で読み込みreadlines()
で読み込み
numpy
loadtxt
で読み込みgenfromtxt
で読み込み
pandas
今回はこの順番で解説する。ちなみに執筆者は初めての読み込みはnumpy
のloadtxt
で行い、genfromtxt
を経て今はpandas
を使用している。
下準備
import re import numpy as np import pandas as pd file = './data.csv'
解説する前に下準備。ファイルはコードと同じディレクトリの「data.csv
」で中身は上に書いた通り。
open
とread()
組み込み関数であるopen
を使用し読み込み方法をread()
とすることで、読み込んだファイル全体を1つのstr
として扱うことができる。
csv
ファイルの読み込みそのもの
f = open(file, 'r') data = f.read() f.close()
ファイルの読み込み自体はこれで完了。以下の方法でも同じ読み込みが可能。この場合だとf.close()
がいらなくなる。どちらでもいいが、今回は初めの方で解説することにする。
with open(file, 'r') as f: data = f.read()
データはstr
として読み込まれる。,
はデータの区切りで、txt
ファイルの場合はtab
などが入ることが多い。
print(type(data)) # <class 'str'> print(data) # row,column1,column2,column3,column4,column5,column6,column7,column8,column9 # 0,1,2,3,4,5,6,7,8,9 # 1,11,12,13,14,15,16,17,18,19 # 2,21,22,23,24,25,26,27,28,29 # 3,31,,33,34,35,36,37,,39 # 4,41,42,43,44,45,46,47,,49 # 5,51,52,53,54,,56,57,58,59 # 6,61,62,63,64,65,66,67,68,69 # 7,71,72,73,74,75,76,77,78,79 print(len(data)) # 290
list
に変換
しかしこの状態だとデータとして使用することが困難なので配列にする。まずはシンプルにlist
にしてみる。しかし、この場合は1文字が1要素として認識され、使えるようなものではなくなる。
print(list(data)) # ['r', 'o', 'w', ',', 'c', 'o', 'l', 'u', 'm', 'n', '1', ',', 'c', 'o', 'l', 'u', 'm', 'n', '2', ',', 'c', 'o', 'l', 'u', 'm', 'n', '3', ',', 'c', 'o', 'l', 'u', 'm', 'n', '4', ',', 'c', 'o', 'l', 'u', 'm', 'n', '5', ',', 'c', 'o', 'l', 'u', 'm', 'n', '6', ',', 'c', 'o', 'l', 'u', 'm', 'n', '7', ',', 'c', 'o', 'l', 'u', 'm', 'n', '8', ',', 'c', 'o', 'l', 'u', 'm', 'n', '9', '\\n', '0', ',', '1', ',', '2', ',', '3', ',', '4', ',', '5', ',', '6', ',', '7', ',', '8', ',', '9', '\\n', '1', ',', '1', '1', ',', '1', '2', ',', '1', '3', ',', '1', '4', ',', '1', '5', ',', '1', '6', ',', '1', '7', ',', '1', '8', ',', '1', '9', '\\n', '2', ',', '2', '1', ',', '2', '2', ',', '2', '3', ',', '2', '4', ',', '2', '5', ',', '2', '6', ',', '2', '7', ',', '2', '8', ',', '2', '9', '\\n', '3', ',', '3', '1', ',', ',', '3', '3', ',', '3', '4', ',', '3', '5', ',', '3', '6', ',', '3', '7', ',', ',', '3', '9', '\\n', '4', ',', '4', '1', ',', '4', '2', ',', '4', '3', ',', '4', '4', ',', '4', '5', ',', '4', '6', ',', '4', '7', ',', ',', '4', '9', '\\n', '5', ',', '5', '1', ',', '5', '2', ',', '5', '3', ',', '5', '4', ',', ',', '5', '6', ',', '5', '7', ',', '5', '8', ',', '5', '9', '\\n', '6', ',', '6', '1', ',', '6', '2', ',', '6', '3', ',', '6', '4', ',', '6', '5', ',', '6', '6', ',', '6', '7', ',', '6', '8', ',', '6', '9', '\\n', '7', ',', '7', '1', ',', '7', '2', ',', '7', '3', ',', '7', '4', ',', '7', '5', ',', '7', '6', ',', '7', '7', ',', '7', '8', ',', '7', '9'] print(len(list(data))) # 290
したがって、読み込み後のstr
を,
で分割することにする。そうすると,
ごとに要素を分割することができる。
lst1 = data.split(',') print(lst1) # ['row', 'column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9\\n0', '1', '2', '3', '4', '5', '6', '7', '8', '9\\n1', '11', '12', '13', '14', '15', '16', '17', '18', '19\\n2', '21', '22', '23', '24', '25', '26', '27', '28', '29\\n3', '31', '', '33', '34', '35', '36', '37', '', '39\\n4', '41', '42', '43', '44', '45', '46', '47', '', '49\\n5', '51', '52', '53', '54', '', '56', '57', '58', '59\\n6', '61', '62', '63', '64', '65', '66', '67', '68', '69\\n7', '71', '72', '73', '74', '75', '76', '77', '78', '79']
うまく分割はできたがこのままだと改行記号の\n
が入ったまま。ということで、,
の他にも\n
でも分割するように設定。
分割方法にはre.split
を使用し、分割方法としては,|\n
(,
もしくは\n
)で指定。
lst2 = re.split(',|\\n', data) print(lst2) # ['row', 'column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '11', '12', '13', '14', '15', '16', '17', '18', '19', '2', '21', '22', '23', '24', '25', '26', '27', '28', '29', '3', '31', '', '33', '34', '35', '36', '37', '', '39', '4', '41', '42', '43', '44', '45', '46', '47', '', '49', '5', '51', '52', '53', '54', '', '56', '57', '58', '59', '6', '61', '62', '63', '64', '65', '66', '67', '68', '69', '7', '71', '72', '73', '74', '75', '76', '77', '78', '79']
これで元のデータだけが残った。
2次元配列に変換
うまく配列にまでしたのはいいが、元々のデータは2次元配列、すなわち表形式。ということで変換する。
変換は利便性の高いnumpy
へと変換。行数が9
なので2次元配列にするreshape
の第一引数は9
、一方で第二引数は必然的に決まるので自動化の-1
を指定。
arr2 = np.array(lst2).reshape(9, -1) print(arr2) # [['row' 'column1' 'column2' 'column3' 'column4' 'column5' 'column6' # 'column7' 'column8' 'column9'] # ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9'] # ['1' '11' '12' '13' '14' '15' '16' '17' '18' '19'] # ['2' '21' '22' '23' '24' '25' '26' '27' '28' '29'] # ['3' '31' '' '33' '34' '35' '36' '37' '' '39'] # ['4' '41' '42' '43' '44' '45' '46' '47' '' '49'] # ['5' '51' '52' '53' '54' '' '56' '57' '58' '59'] # ['6' '61' '62' '63' '64' '65' '66' '67' '68' '69'] # ['7' '71' '72' '73' '74' '75' '76' '77' '78' '79']]
データ部分を文字列から数値へ変換
ここで、全データが文字列であることがわかる。具体的には0
ではなく'0'
となっているということ。これだと計算がしにくい。
ということで以下のようにarray
作成時にdtype
をfloat
にするとエラー。ヘッダ部分が文字列なのでfloat
にできない。
# ヘッダ部分がfloatに変換できない arr2 = np.array(arr2, dtype=float) # ValueError: could not convert string to float: 'row'
そこで以下のように、ヘッダではfloat
に変換できないので何もせず、データ部分はfloat
にするというコードを作成した。ここで、np.float64
で配列ごとdtype
を変換している。
ans = [] for i in arr2: try: arr2_f = np.array(i, dtype=np.float64) except ValueError: arr2_f = i ans.append(arr2_f)
結果は以下。データ部分も途中、文字列になっている。
print(ans) # [array(['row', 'column1', 'column2', 'column3', 'column4', 'column5', # 'column6', 'column7', 'column8', 'column9'], dtype='<U7'), array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]), array([ 1., 11., 12., 13., 14., 15., 16., 17., 18., 19.]), array([ 2., 21., 22., 23., 24., 25., 26., 27., 28., 29.]), array(['3', '31', '', '33', '34', '35', '36', '37', '', '39'], dtype='<U7'), array(['4', '41', '42', '43', '44', '45', '46', '47', '', '49'], # dtype='<U7'), array(['5', '51', '52', '53', '54', '', '56', '57', '58', '59'], # dtype='<U7'), array([ 6., 61., 62., 63., 64., 65., 66., 67., 68., 69.]), array([ 7., 71., 72., 73., 74., 75., 76., 77., 78., 79.])]
これは以下のように空白文字に対応して入れられた''
がfloat
として変換できないから。
print(float('')) # ValueError: could not convert string to float: ''
ということで最終的に落ち着いた方法が以下。ヘッダとデータ部分を分けた。
header = arr2[0] ans = [] for num, i in enumerate(arr2[1:]): ans.append([]) for j in i: try: arr2_f = float(j) except ValueError: arr2_f = np.nan ans[num].append(arr2_f) ans = np.array(ans) print(header) # ['row' 'column1' 'column2' 'column3' 'column4' 'column5' 'column6' # 'column7' 'column8' 'column9'] print(ans) # [[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] # [ 1. 11. 12. 13. 14. 15. 16. 17. 18. 19.] # [ 2. 21. 22. 23. 24. 25. 26. 27. 28. 29.] # [ 3. 31. nan 33. 34. 35. 36. 37. nan 39.] # [ 4. 41. 42. 43. 44. 45. 46. 47. nan 49.] # [ 5. 51. 52. 53. 54. nan 56. 57. 58. 59.] # [ 6. 61. 62. 63. 64. 65. 66. 67. 68. 69.] # [ 7. 71. 72. 73. 74. 75. 76. 77. 78. 79.]]
open
とreadlines()
組み込み関数であるopen
を使用し読み込み方法をreadlines()
とすることで、読み込んだファイルを1行を1つの要素としたlist
として扱うことができる。
csv
ファイルの読み込みそのもの
f = open(file, 'r') data = f.readlines() f.close()
ファイル読み込み自体はread()
とほぼ同じ。ただ、出力が異なる。
print(type(data)) # <class 'list'> print(data) # ['row,column1,column2,column3,column4,column5,column6,column7,column8,column9\\n', '0,1,2,3,4,5,6,7,8,9\\n', '1,11,12,13,14,15,16,17,18,19\\n', '2,21,22,23,24,25,26,27,28,29\\n', '3,31,,33,34,35,36,37,,39\\n', '4,41,42,43,44,45,46,47,,49\\n', '5,51,52,53,54,,56,57,58,59\\n', '6,61,62,63,64,65,66,67,68,69\\n', '7,71,72,73,74,75,76,77,78,79'] print(len(data)) # 9
2次元配列に変換
list
になっているものの、1行全列が1つのstr
になっているので,
で区切って要素を分解する必要がある。また、改行記号\n
は残っているのでこれも削除する。
arr2 = [] for i in data: lst2 = re.sub('\\n', '', i) lst2 = lst2.split(',') arr2.append(lst2) # print(lst2) print(arr2) # [['row', 'column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9'], ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], ['1', '11', '12', '13', '14', '15', '16', '17', '18', '19'], ['2', '21', '22', '23', '24', '25', '26', '27', '28', '29'], ['3', '31', '', '33', '34', '35', '36', '37', '', '39'], ['4', '41', '42', '43', '44', '45', '46', '47', '', '49'], ['5', '51', '52', '53', '54', '', '56', '57', '58', '59'], ['6', '61', '62', '63', '64', '65', '66', '67', '68', '69'], ['7', '71', '72', '73', '74', '75', '76', '77', '78', '79']]
見にくいが一応これで行と列を独立して分解することができた。あとはまだlist
なのでnumpy
配列にするだけ。そのあとはread()
の時と同様。
arr2 = np.array(arr2) # print(arr2) # # [['row' 'column1' 'column2' 'column3' 'column4' 'column5' 'column6' # # 'column7' 'column8' 'column9'] # # ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9'] # # ['1' '11' '12' '13' '14' '15' '16' '17' '18' '19'] # # ['2' '21' '22' '23' '24' '25' '26' '27' '28' '29'] # # ['3' '31' '' '33' '34' '35' '36' '37' '' '39'] # # ['4' '41' '42' '43' '44' '45' '46' '47' '' '49'] # # ['5' '51' '52' '53' '54' '' '56' '57' '58' '59'] # # ['6' '61' '62' '63' '64' '65' '66' '67' '68' '69'] # # ['7' '71' '72' '73' '74' '75' '76' '77' '78' '79']]
np.loadtxt
とnp.genfromtxt
続いてはnumpy
を使用した方法。ここではnp.loadtxt
とnumpy.genfromtxt
を解説する。というよりこれ以外はマイナーすぎて使わない気もする。
np.loadtxt
読み込みは簡単で、ファイル名と区切り文字を指定するだけ。csv
ファイルなので区切り文字は,
。
しかし、ヘッダが文字なので読み込めない。
load = np.loadtxt(file, delimiter=',') # ValueError: could not convert string to float: 'row'
そこで引数skiprowsで1を指定して上から1行を読み込まないようにする。するとヘッダではエラーは出ないが欠損部分の''で同様のエラーが発生する。
load = np.loadtxt(file, delimiter=',', skiprows=1) # ValueError: could not convert string to float: ''
すなわち、loadtxtだと数値以外のデータは扱えないということ。一応回避方法として文字列として読み込む方法として以下があるが、文字で読み込むとまた数値に変換するのがだるい。
load = np.loadtxt(file, delimiter=',', dtype='unicode') print(load) # [['row' 'column1' 'column2' 'column3' 'column4' 'column5' 'column6' # 'column7' 'column8' 'column9'] # ['0' '1' '2' '3' '4' '5' '6' '7' '8' '9'] # ['1' '11' '12' '13' '14' '15' '16' '17' '18' '19'] # ['2' '21' '22' '23' '24' '25' '26' '27' '28' '29'] # ['3' '31' '' '33' '34' '35' '36' '37' '' '39'] # ['4' '41' '42' '43' '44' '45' '46' '47' '' '49'] # ['5' '51' '52' '53' '54' '' '56' '57' '58' '59'] # ['6' '61' '62' '63' '64' '65' '66' '67' '68' '69'] # ['7' '71' '72' '73' '74' '75' '76' '77' '78' '79']]
np.genfromtxt
そんな数値以外のデータを扱うときに便利なのがnp.genfromtxt
。こちらを使用すると文字でも読んでくれる。ただし、文字部分はnan
表記となる。
nan
だと四則演算が全てnan
になったりややこしい挙動があるので注意が必要。
genfrom = np.genfromtxt(file, delimiter=',') print(genfrom) # [[nan nan nan nan nan nan nan nan nan nan] # [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] # [ 1. 11. 12. 13. 14. 15. 16. 17. 18. 19.] # [ 2. 21. 22. 23. 24. 25. 26. 27. 28. 29.] # [ 3. 31. nan 33. 34. 35. 36. 37. nan 39.] # [ 4. 41. 42. 43. 44. 45. 46. 47. nan 49.] # [ 5. 51. 52. 53. 54. nan 56. 57. 58. 59.] # [ 6. 61. 62. 63. 64. 65. 66. 67. 68. 69.] # [ 7. 71. 72. 73. 74. 75. 76. 77. 78. 79.]]
ヘッダを分けるのであれば、loadtxt
と同様、skip_header
を使用してヘッダを読み込まなくさせればいい。
genfrom = np.genfromtxt(file, delimiter=',', skip_header=1) print(genfrom) # [[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] # [ 1. 11. 12. 13. 14. 15. 16. 17. 18. 19.] # [ 2. 21. 22. 23. 24. 25. 26. 27. 28. 29.] # [ 3. 31. nan 33. 34. 35. 36. 37. nan 39.] # [ 4. 41. 42. 43. 44. 45. 46. 47. nan 49.] # [ 5. 51. 52. 53. 54. nan 56. 57. 58. 59.] # [ 6. 61. 62. 63. 64. 65. 66. 67. 68. 69.] # [ 7. 71. 72. 73. 74. 75. 76. 77. 78. 79.]]
読み込まれた後の配列はnumpy.ndarray
の2次元のもので、要素指定は(2D配列名)[(行番号)][(列番号)]
で行う。[(列番号)]を省くことで行全体を抽出可能。
print(type(genfrom)) # <class 'numpy.ndarray'> print(genfrom[0]) # [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] print(genfrom[0][2]) # 2.0
pd.read_csv
最後はpandas
。pandas
の配列は特殊な形をしているのでとっかかりにくいが、一度慣れると便利すぎて離れられない。
とりあえず読み込み
読み込みはnumpy
の時と同じイメージ。区切り文字指定はsep
だけでなくdelimiter
も可能。
df = pd.read_csv(file, sep=',') print(df) # row column1 column2 column3 ... column6 column7 column8 column9 # 0 0 1 2.0 3 ... 6 7 8.0 9 # 1 1 11 12.0 13 ... 16 17 18.0 19 # 2 2 21 22.0 23 ... 26 27 28.0 29 # 3 3 31 NaN 33 ... 36 37 NaN 39 # 4 4 41 42.0 43 ... 46 47 NaN 49 # 5 5 51 52.0 53 ... 56 57 58.0 59 # 6 6 61 62.0 63 ... 66 67 68.0 69 # 7 7 71 72.0 73 ... 76 77 78.0 79 # [8 rows x 10 columns] print(type(df)) # <class 'pandas.core.frame.DataFrame'>
いきなり表形式で出てきて驚くが、これがpandas
特有のDataFrame
というもの。使い方は後で軽く触れる。
インデックスを指定して読み込み
インデックス用に設定したrow
を簡単にインデックスとして設定できる。設定は引数index_col
で列番号を指定するだけ。今回は0
行目のrow
なのでindex_col=0
。
df = pd.read_csv(file, sep=',', index_col=0) print(df) # column1 column2 column3 column4 ... column6 column7 column8 column9 # row ... # 0 1 2.0 3 4 ... 6 7 8.0 9 # 1 11 12.0 13 14 ... 16 17 18.0 19 # 2 21 22.0 23 24 ... 26 27 28.0 29 # 3 31 NaN 33 34 ... 36 37 NaN 39 # 4 41 42.0 43 44 ... 46 47 NaN 49 # 5 51 52.0 53 54 ... 56 57 58.0 59 # 6 61 62.0 63 64 ... 66 67 68.0 69 # 7 71 72.0 73 74 ... 76 77 78.0 79 # [8 rows x 9 columns]
これでデータ部分とインデックスを独立させることができた。
ヘッダの取り出し
col_name = list(df) print(col_name) # ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9'] col_name = df.keys() print(col_name) # Index(['column1', 'column2', 'column3', 'column4', 'column5', 'column6', # 'column7', 'column8', 'column9'], # dtype='object') print(list(col_name)) # ['column1', 'column2', 'column3', 'column4', 'column5', 'column6', 'column7', 'column8', 'column9']
ヘッダ単体での取り出しが可能で、コードは2パターンある。
- ヘッダ名だけ欲しい:
list(df)
- ヘッダ名とその他の情報も欲しい
: df.keys()
基本は前者で十分対応できる。
データの抽出と編集
データの抽出について、まずはインデックスはdf.index
で抽出できる。また、その値が欲しいなら.values
をすればいい。注意点は.values()
ではないということ。dict
の感覚でやるとエラーになる。
row = df.index print(row) # Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64', name='row') print(row.values) # [0 1 2 3 4 5 6 7] print(type(row.values)) # <class 'numpy.ndarray'>
データ部分全体も.values
で可能。
data = df.values print(data) # [[ 1. 2. 3. 4. 5. 6. 7. 8. 9.] # [11. 12. 13. 14. 15. 16. 17. 18. 19.] # [21. 22. 23. 24. 25. 26. 27. 28. 29.] # [31. nan 33. 34. 35. 36. 37. nan 39.] # [41. 42. 43. 44. 45. 46. 47. nan 49.] # [51. 52. 53. 54. nan 56. 57. 58. 59.] # [61. 62. 63. 64. 65. 66. 67. 68. 69.] # [71. 72. 73. 74. 75. 76. 77. 78. 79.]] print(type(data)) # <class 'numpy.ndarray'>
ある特定の列のみを抽出したい時は列名で指定すればいい。これが一番の特徴ではないだろうか。2列目などのようにインデックスで指定しなくていい。直接指定できる。
ただし、単純に列名指定だけをしてもSeries
という型の配列が出るだけ。これはこれで厄介な形式ですぐに他の方に変換してSeries
ではあまり使っていない。
column8 = df['column8'] print(column8) # row # 0 8.0 # 1 18.0 # 2 28.0 # 3 NaN # 4 NaN # 5 58.0 # 6 68.0 # 7 78.0 # Name: column8, dtype: float64 print(type(column8)) # <class 'pandas.core.series.Series'>
Series
からnumpy.ndarray
に変換する際もまた.values
で変換。
column8_val = column8.values print(column8_val) # [ 8. 18. 28. nan nan 58. 68. 78.] print(type(column8_val)) # <class 'numpy.ndarray'>
pandas
が使えるようになると列名指定が簡単に使えるのでかなり便利。
条件追加
最後にある条件を満たす配列のみ抽出したいという場合の書き方を紹介する。
まずは行番号が4
以下のcolumn8
のデータ。True
とFalse
の配列にできればそれをインデックスにすればいい。
cond1 = row.values <= 4 print(cond1) # [ True True True True True False False False] print(column8_val[cond1]) # [ 8. 18. 28. nan nan]
次は複数条件の時。複数の時はかっこ()
と&
が必要。and
ではエラーとなるので注意。
cond2 = (2 < row.values) & (row.values <= 4) print(cond2) # [False False False True True False False False] print(column8_val[cond2]) # [nan nan]
最後はNaN
だけ抽出。NaN
の場合はnp.nan == np.nan
がFalse
になるという仕様なので、np.isnan
という専用の関数でNaN
かどうかを判定する。
cond3 = np.isnan(column8) print(cond3) # row # 0 False # 1 False # 2 False # 3 True # 4 True # 5 False # 6 False # 7 False # Name: column8, dtype: bool print(column8[cond3]) # row # 3 NaN # 4 NaN # Name: column8, dtype: float64 print(type(column8[cond3])) # <class 'pandas.core.series.Series'>
ここで、column8
のまま条件を付加するとSeries
になるので注意。無駄に色々な情報が出るので邪魔ならnumpy
配列に変換するなど工夫が必要。
ファイルの読み込みで出来ることが広がる
今回はpythonを使用したcsv
ファイルの読み込みについて解説した。外部ファイルを使用することができると、処理後のデータを一時的に保管できたり、外部からデータを入手して読み込んで使用できる。
つまりpythonで出来ることが増える。増えると新しい世界が待っているので初心者の方は今回の記事も参考にファイルを読みまくってほしい。
関連記事
-
-
【pandas&NaN】データフレームdfのNaN部分を空にする
続きを見る
-
-
【python&list】pythonのlistの超基礎
続きを見る
-
-
【python3&zip関数】python3系にてzipは一回使ったら消える
続きを見る
-
-
【Python3.10&パターンマッチ】match文を試してみる
続きを見る