カテゴリー

Python基礎

【python&csv読み込み】pythonを使ってcsvを読み込み

2021年5月29日

こんな人にオススメ

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
スポンサーリンク
スポンサーリンク

運営者のメガネと申します。TwitterInstagramも運営中。

自己紹介はこちらから、お問い合わせはこちらからお願いいたします。

運営者メガネ

データそのものとデータ読み込みの種類

まずは今回使用するcsvファイルと、データ読み込みの種類について解説する。

使用するデータ

まずは今回使用するcsvファイルを以下に示す。

rowcolumn1column2column3column4column5column6column7column8column9
0123456789
1111213141516171819
2212223242526272829
331333435363739
44142434445464749
55152535456575859
6616263646566676869
7717273747576777879

row列がインデックスとして指定したい列で、columnと名のつく列がそれぞれのデータ列と解釈していただきたい。

columnは基本的に左から右へ、下から上へ進むにつれて数値が大きくなるデータだが、一部のデータを削除して穴あきにしている。この穴あきがあるだけでデータの扱いが面倒になる。

データ読み込みの種類

pythonでは様々な方法でcsvファイルを読み込むことが可能。以下にその一部を抜粋する。これらはメジャーな方法。

  • open
    • read()で読み込み
    • readlines()で読み込み
  • numpy
    • loadtxtで読み込み
    • genfromtxtで読み込み
  • pandas

今回はこの順番で解説する。ちなみに執筆者は初めての読み込みはnumpyloadtxtで行い、genfromtxtを経て今はpandasを使用している。

下準備

import re
import numpy as np
import pandas as pd

file = './data.csv'

解説する前に下準備。ファイルはコードと同じディレクトリの「data.csv」で中身は上に書いた通り。

openread()

組み込み関数である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作成時にdtypefloatにするとエラー。ヘッダ部分が文字列なので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.]]

openreadlines()

組み込み関数である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.loadtxtnp.genfromtxt

続いてはnumpyを使用した方法。ここではnp.loadtxtnumpy.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

最後はpandaspandasの配列は特殊な形をしているのでとっかかりにくいが、一度慣れると便利すぎて離れられない。

とりあえず読み込み

読み込みは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のデータ。TrueFalseの配列にできればそれをインデックスにすればいい。

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.nanFalseになるという仕様なので、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文を試してみる

続きを見る

関連コンテンツ

スポンサーリンク

Amazonのお買い物で損したない人へ

1回のチャージ金額通常会員プライム会員
¥90,000〜2.0%2.5%
¥40,000〜1.5%2.0%
¥20,000〜1.0%1.5%
¥5,000〜0.5%1.0%

Amazonギフト券にチャージすることでお得にお買い物できる。通常のAmazon会員なら最大2.0%、プライム会員なら2.5%還元なのでバカにならない。

ゲットしたポイントは通常のAmazonでのお買い物に使えるからお得だ。一度チャージしてしまえば、好きなタイミングでお買いものできる。

なお、有効期限は10年だから安心だ。いつでも気軽にAmazonでお買い物できる。

Amazonチャージはここから出来るで

もっとお得なAmazon Prime会員はこちらから

30日間無料登録

執筆者も便利に使わせてもらってる

スポンサーリンク

  • この記事を書いた人

メガネ

独学でpythonを学び天文学系の大学院を修了。 ガジェット好きでMac×Android使い。色んなスマホやイヤホンを購入したいけどお金がなさすぎて困窮中。 元々、人見知りで根暗だったけど、人生楽しもうと思って良い方向に狂ったために今も人生めちゃくちゃ楽しい。 pythonとガジェットをメインにブログを書いていますので、興味を持たれましたらちょこちょこ訪問してくだされば幸いです🥰。 自己紹介→変わって楽しいの繰り返し

-Python基礎
-,