カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

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

運営者のメガネです。YouTubeTwitterInstagramも運営中。自己紹介お問い合わせページあります。

運営者メガネ

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

まずは今回使用する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

今回はこの順番で解説する。ちなみに執筆者は初めての読み込みは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文を試してみる

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

完全ワイヤレスイヤホン(TWS)

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-Python基礎
-,