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

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

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

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

Q&A

解決済

1回答

617閲覧

pandasで緯度経度を含むファイルの処理をしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2022/05/06 06:26

編集2022/05/06 16:43
  1. 前提・実現したいこと

あるディレクトリに
'136.100000', '40.050000'.pkl
'137.200000', '41.050000'.pkl
'138.350000', '42.050000'.pkl
'139.505000', '43.050000'.pkl

のように緯度経度がファイル名となっているpklファイルが多数格納してあり、
これに対し、
あるテーブルファイル(csv):dfに
lon lat
0 141.4125 41
1 141.4225 41
2 141.4325 41
3 141.4425 41
4 141.5000 41
... ... ... ... ...
1000 132.0000 30.2
のようにlon latが一覧化されていて、
テーブルファイルを基に、あるディレクトリ内のpklファイルを取得したいと思っています。
ただ、ファイル名は小数点以下6位まであるので、テーブルファイルの型をstr(object)に直し、
検索をかけれるようにしたつもりなのですが、エラーが出てしまい、検索までたどり着くことができません。。

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

文字コード変換は
df["lat"] = df["lat"].astype("str")
で普通に型変換し、df.info()でobject型になっていることを確認していますが、
その次に
df["lon"].apply(lambda x: '{:.6f}'.format(x))
で、小数点以下6位まで指定してやると
「ValueError: Unknown format code 'f' for object of type 'str'」というエラーがでます。
列全体数字しか入っていないので、なぜこういうエラーが出るのかわかりません・・

また、小数点以下6位までに設定できたら、その先の予定で、
lon = df.iat[1, 0]
lat = df.iat[1, 1]
df_test = pd.read_pickle("../directry/('{}','{}').pkl".format(lon, lat))
df_test
のようなコードを基にfor文でテーブルの1000行を一括で検索をかけたいと思っていますが、これで果たしてできるのか、
という所も試せないので焦っています・・

  1. 該当のソースコード

Jupyterで書いているので、空行の部分でcellがわかれています。
ーー
import pandas as pd
import pickle
import csv

#テーブル読み込み
df = pd.read_csv("../table.csv")

df["lon"] = df["lon"].astype("str")
df["lat"] = df["lat"].astype("str")

df["lon"].apply(lambda x: '{:.6f}'.format(x))
df["lat"].apply(lambda x: '{:.6f}'.format(x))
→ValueError: Unknown format code 'f' for object of type 'str'

lon = df.iat[1, 0]
lat = df.iat[1, 1]
df_test = pd.read_pickle("../directry/('{}','{}').pkl".format(lon, lat))
df_test

わかる方に是非ご助言頂きたいです。よろしくお願いいたします。

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

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

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

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

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

meg_

2022/05/06 06:38

再現できるコードを掲載いただけませんか?
退会済みユーザー

退会済みユーザー

2022/05/06 06:51

すみません、、ここまではあまり大したコードを書いていないのです。。 Jupyterで書いているので、空行の部分でcellがわかれています。 ーー import pandas as pd import pickle import csv #テーブル読み込み df = pd.read_csv("../table.csv") df["lon"] = df["lon"].astype("str") df["lat"] = df["lat"].astype("str") df["lon"].apply(lambda x: '{:.6f}'.format(x)) df["lat"].apply(lambda x: '{:.6f}'.format(x)) →ValueError: Unknown format code 'f' for object of type 'str' lon = df.iat[1, 0] lat = df.iat[1, 1] df_test = pd.read_pickle("../directry/('{}','{}').pkl".format(lon, lat)) df_test
meg_

2022/05/06 07:06

お手数ですが、質問に追記してください。(コードは「コードの挿入」で記入してください)
melian

2022/05/06 07:12

> 列全体数字しか入っていないので、なぜこういうエラーが出るのかわかりません・・ 文字列に変換しているからです。astype('str') は不要で、 df["lon"].apply(lambda x: '{:.6f}'.format(x)) だけでよいのではないでしょうか。
退会済みユーザー

退会済みユーザー

2022/05/06 07:27 編集

melian様 df["lon"].apply(lambda x: '{:.6f}'.format(x)) だけにすると、結局の所 lon lat 0 141.4125 41 1 141.4225 41 2 141.4325 41 3 141.4425 41 4 141.5000 41 ... ... ... ... ... 1000 132.0000 30.2 ¦ のように、小数点以下6位まで表示されないので、一度object型にしてみた次第です。。
melian

2022/05/06 07:28

はい、変換結果を戻す必要があります。 df["lon"] = df["lon"].apply(lambda x: '{:.6f}'.format(x))
退会済みユーザー

退会済みユーザー

2022/05/06 07:37

すごく初歩的でした。。 ありがとうございます!! objectにする必要はないのですね。。なぜかすごくはまってしまいました・・
guest

回答1

0

ベストアンサー

文字列に変換する必要はなく、
df["lon"] = df["lon"].apply(lambda x: '{:.6f}'.format(x))で戻すことで反映される。
melian様ありがとうございます。

投稿2022/05/06 07:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問