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

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

ただいまの
回答率

90.84%

  • Python 3.x

    4862questions

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

  • pandas

    415questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

データフレームの各行に関数を適用したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 262

tunamayo1222

score 5

いつもお世話になります。
データフレームの操作方法について皆様のお知恵を拝借いただけないでしょうか。

前提・実現したいこと

目標としては、データフレーム上のデータを関数で演算し、元のデータフレームに追加したいです。

今回の例で話をするとデータフレーム内にあるlat,lonという列データをmeshcode関数(自作関数)に渡して、meshcodeという列を元のデータフレームに追加するのが目標です。

lat            lon
34.94975752    139.0699043
34.94975753    139.0699043
34.94975754    139.0699043
34.9497575    139.0699043


データ加工例。(ゴール)

lat    lon    meshcode
34.94975752    139.0699043    52393035
34.94975753    139.0699043    52393035
34.94975754    139.0699043    52393035
34.9497575    139.0699043    52393035

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

エラーメッセージ
TypeError: cannot convert the series to <class 'float'>

該当のソースコード

mainファイル

#メッシュコード変換関数の格納フォルダを指定↓
import sys; sys.path.append(r'module_folder_path')
#メッシュコード変換関数↓
import latlong_to_meshcode as msh
import pandas as pd
import numpy as np
import datetime

data = pd.read_table('filedata',names=['lat','lon'],header=0,dtype = 'object')

var_id = ['id']
var_val = ['lat','lon']
data[var_id] = data[var_id].astype(object)
data[var_val] = data[var_val].astype(float)

df['meshcode']=msh.latlong_to_meshcode(df['lat'],df['lon']))


メッシュコード変換ファイル

def latlong_to_meshcode(lat, long, order = 3):

    if type(lat) != float:  # 実数型でないなら変換
        lat = float(lat)

    if type(long) != float: # 実数型でないなら変換
        long = float(long)

    if (order < 1) | (order > 3):
        raise Exception ("Invalid parameter to latlong_to_meshcode()")

    # Latitude

    lat_in_min = lat * 60.0

    code12 = int(lat_in_min / 40)  # codeの1, 2文字目部分(数値)
    lat_rest_in_min = lat_in_min - code12 * 40     # 残差

    code5 = int(lat_rest_in_min / 5 )    #  code 5文字目 二次メッシュの1区画は緯度5分
    lat_rest_in_min -= code5 * 5        #  残差

    code7 = int(lat_rest_in_min / (5/10)) # code 7文字目 三次メッシュの1区画は緯度5分の 1/10

    # Longitude

    code34 = int(long) - 100  # codeの3, 4文字目部分(数値)

    long_rest_in_deg = long - int(long)

    code6 = int(long_rest_in_deg * 8)
    long_rest_in_deg -= code6 / 8;

    code8 = int(long_rest_in_deg / (1/80) )

    code = code12 * 100 + code34

    if order >= 2:
        code = code * 100 + code5 * 10 + code6

    if order == 3:
        code = code * 100 + code7 * 10 + code8

    return int(code)

実施した内容

df.apply(axis=1)でlat/lonの列にmeshcodeの関数を渡してみたのですが、keyerrorを出力してしまいました。

data['lat','lon'].apply(msh.latlong_to_meshcode,axis=1)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

.applyのパターンで、
gps[['lat','lon']].apply(.....)

def latlong_to_meshcode(lat_and_long, order=3):
    lat = lat_and_long[0]
    lon = lat_and_long[1]
    ....


としてもKeyErrorが出ますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 00:10

    回答有難うございます!
    ご助言いただきました通り、meshcode関数を修正し、渡す変数を1つにしたら無事動作しました!
    助かりました。m(_ _)m

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    4862questions

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

  • pandas

    415questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。