概要
DataFrameは列同士の型が異なってもよいが、配列でデータを組み立てる場合に数値と文字を混在させると、数値が全て文字列となってしまうので注意が必要。
配列は不適
以下のようにndarrayで文字列と数値を混在させたデータを基にしてDataFrameを生成すると、その内容が全て文字列になってしまう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np from pandas import DataFrame ary = np.array([ ["Alex", "DC", 44, 168], ["Bert", "NY", 18, 176], ["Carl", "CA", 26, 175] ]) df = DataFrame(ary, columns=["name", "state", "age", "height"]) df = df.set_index("name") print(df.values) # [['DC' '44' '168'] # ['NY' '18' '176'] # ['CA' '26' '175'] |
このデータの数値演算を行おうとすると以下のように文字列演算になってしまう。
1 2 3 |
print(df.loc["Alex", "age"] + df.loc["Bert", "age"]) # 4418 |
これはndarrayが型の混在を許さないためで、いわばケアレスミスだが注意。
リストはOK
元のデータをリストにすれば問題なく数値と文字列に分けられる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
lst = [ ["Alex", "DC", 44, 168], ["Bert", "NY", 18, 176], ["Carl", "CA", 26, 175] ] df = DataFrame(lst, columns=["name", "state", "age", "height"]) df = df.set_index("name") print(df.values) # [['DC' 44 168] # ['NY' 18 176] # ['CA' 26 175]] print(df.loc["Alex", "age"] + df.loc["Bert", "age"]) # 62 |
列の辞書もOK
列ごとのリストを辞書で組み立てても数値と文字は分けられる。
1 2 3 4 5 6 7 8 9 10 11 |
names = ["Alex", "Bert", "Carl"] states = ["DC", "NY", "CA"] ages = [44, 18, 26] heights = [168, 176, 175] df = DataFrame({"state":states, "age":ages, "height":heights}, index=names) print(df.values) # [['DC' 44 168] # ['NY' 18 176] # ['CA' 26 175]] |