質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

8121閲覧

Python_数値と文字列が混在するcsvを読み込む方法を教えてください

KotaUeki

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/03/27 13:49

編集2018/03/27 14:10

前提・実現したいこと

csvファイルに、以下のように数値と文字列が混在するリストがあります。

Lat, Lon, Place,
39.12, 135.33, AAA,
35.54, 139.22, BBB,
(以下、同じように「緯度(数値)」「経度(数値)」「場所の名前(文字列)」が続いています)

該当のソースコード

Python3 import numpy as np states = np.loadtxt('posi.csv', skiprows = 0, delimiter=',', dtype='float')

発生している問題・エラーメッセージ

上記のようなcsvデータを以下のコードで読み込もうとしても、
Placeに該当する部分が文字列の為、
「ValueError: could not convert string to float: 'AAA'」
というエラーが出てしまいます。

一度文字列として読み込んだ後に、数字の部分だけを数値として認識できるように変換させるのが
いいのかと思いましたが、適当な変換するコードが見つかりません。

最終的には、マップ上にリストの各緯度経度のマーカーをプロットし、
マーカーにカーソルオンすると場所の名前がポップアップするプログラムを書きたいのですが、
csvの読み込みの部分で困っております。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tachikoma

2018/03/27 23:30 編集

サンプルのcsv、経度のドットがカンマになってしまっていますね。
guest

回答4

0

numpy.loadtxtでも可能ですがnumpyは文字列は苦手なので、pandas.read_csvのほうが簡便だと思います。

Python

1from io import StringIO 2s = """Lat, Lon, Place, 339.12, 135.33, AAA, 435.54, 139.22, BBB, 5""" 6 7import numpy as np 8# Placeは空白含み最大10文字が前提 9ret = np.loadtxt( StringIO(s),delimiter=",", skiprows=1, dtype='float,float,S10') 10print(ret) 11# [( 39.12, 135.33, b' AAA') ( 35.54, 139.22, b' BBB')] 12 13import pandas as pd 14# 空白は無視、0~2列目のみ 15ret = pd.read_csv( StringIO(s), skipinitialspace=True, usecols=[0,1,2]) 16print(ret) 17""" 18 Lat Lon Place 190 39.12 135.33 AAA 201 35.54 139.22 BBB 21"""

投稿2018/03/27 14:22

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

ひとまずの解決策ですが、pandasのread.csvを使うと簡単にできますよ。
(簡単のため行末のカンマを取り除いた状態で扱っています。)

python

1import pandas as pd 2states = pd.read_csv('posi.csv', index_col=False, 3 delimiter=r",\s*", engine="python") 4 5states 6# Lat Lon Place 7# 0 39.12 135.33 AAA 8# 1 35.54 139.22 BBB 9 10states.iloc[0] 11# Lat 39.12 12# Lon 135.33 13# Place AAA 14# Name: 0, dtype: object 15 16states.iloc[0]["Lat"] 17# 39.12

データフレームがいやな場合、次のように数値の部分だけnumpy.arrayとリストにバラせます。

Python

1location = states[["Lat", "Lon"]].values 2place = states["Place"].tolist()

投稿2018/03/27 14:18

編集2018/03/27 14:24
tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KotaUeki

2018/03/27 14:47

ありがとうございます。 頂いた回答をもとに、地図上にリストの各緯度経度に従ってマーカーをプロットする プログラムができました。
guest

0

pandasで書いてみました。

python

1import pandas as pd 2 3def lon_to_float(string): 4 lst = string.split(",") 5 return float(".".join(lst)) 6 7def main(): 8 # 区切りのフォーマットが汚いので正規表現を使ってごちゃごちゃやってる 9 # カンマの後のスペースが入ってたのでそれを利用したが、入っていない場合はもっと工夫が必要 10 # engine="python"を指定しないとwarningが出る 11 # dypteを指定してその型で読ませる 12 # Lonは面倒くさいことにカンマが混ざるので、とりあえずstrで読む 13 df = pd.read_csv("data.csv", sep=",\s+|,$", engine="python", 14 dtype={"at":float, "Lon":str, "Place":str}) 15 16 # Lonをfloatに変換 17 df["Lon"] = df["Lon"].apply(lon_to_float) 18 19 # 行末にカンマが付いてるせいで無駄な列ができるので除去 20 df = df.loc[:, ~df.columns.str.contains('^Unnamed')] 21 print(df) 22 23if __name__ == "__main__": 24 main() 25 26"""出力 27 at Lon Place 280 39.12 135.33 AAA 291 35.54 139.22 BBB 30""" 31

もし綺麗なCSVを得る手段があるのでしたら、そうすることで多少労力が減らせます。

  • カンマの間にスペースを入れない
  • Lonを普通の小数表記で得る
  • 行末のカンマをなくす

などが改善点です(他にもあるかも)。

投稿2018/03/27 14:13

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KotaUeki

2018/03/27 15:51

dtype=・・・の構文、参考になります。ありがとうございました。
guest

0

pythonには、まさにCSVハンドリング用のユニット、csv があるようです

https://docs.python.jp/3/library/csv.html

「python csv」でぐぐるといろいろでてきますねー

投稿2018/03/27 13:56

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問