2017-09-27 1 views
-1

他の変数と一緒に座標を持つ辞書を含む 'location'カラムを持つ複数の.csvファイルがあります。私はこの辞書を単独で呼び出すのに苦労しています。エラーTypeError: string indices must be integers, not strまたはNaNが表示されます。パンダのデータフレームで辞書内の座標を返すもっとも簡単な方法

私のdata変数は、pandasデータフレームに変換された.csvファイルです。

私のdfは、locationからdataまでの列で、このようになります。

df = pd.DataFrame.from_dict(loc, orient='index') 
df 

              0 
0 {'type': 'Point', 'coordinates': [16.835441, ... 
1 {'coordinates': [16.835441, 97.292495255... 
2 {'coordinates': [16.835441, 97.292495255... 
3 {'coordinates': [16.835441, 97.292495255... 
4 {'type': 'Point', 'coordinates': [16.835441, ... 

10個の.csvファイルに対して800行になります。

ここまで私が試した2つの方法があります。 data['location'].map(lambda v:v['coordinates'])をし、エラーTypeError: string indices must be integers, not strを得る:

            0  coords 
0 {'type': 'Point', 'coordinates': [16.835441, ... NaN 
1 {'coordinates': [16.835441, 97.292495255...   NaN 
2 {'coordinates': [16.835441, 97.292495255...   NaN 
3 {'coordinates': [16.835441, 97.292495255...   NaN 

を返すか、私はこれを試してみてください

import re 
coords = [] 
for row in df[0]: 
    try: 
     coords.append.re.findall(r'\[(.*?)\]',s) 
    except: 
     coords.append(np.NaN) 

私の2つの方法のどちらに問題がありますか?あるいはこれを行うもっと単純な方法がありますか?

編集:「xcoord」と「ycoord」の2つの列が返されます。エラーがCSVを読んでの選択によって可能性があるため、https://www.dropbox.com/s/c01scfe0jmszfuz/test.csv?dl=0

+0

ベターポストCSVファイルの小断片:

はここで.csvファイルの例バージョンです。 'df'では、行に異なるデータ構造が含まれているために懐疑的です。これは悪い兆候です。 –

+0

ありがとう@EvgenyPogrebnyak。私はCSVとのリンクを追加しました – JAG2024

答えて

1
import io 
import pandas as pd 
import json 

doc = """_id,created,location,public,time_stamp,updated 
53a1f3g44rf7a33ffgh43hh,8/12/16 6:55,"{'coordinates': [16.835441, 97.292495255], 'type': 'Point'}",TRUE,6/3/16 23:30,6/3/16 2:55 
53a1f3g44rf7a33ffgh43hh,8/13/16 6:55,"{'coordinates': [16.835441, 97.292495255], 'type': 'Point'}",TRUE,6/4/16 23:30,6/4/16 2:55 
53a1f3g44rf7a33ffgh43hh,8/14/16 6:55,"{'coordinates': [16.835441, 97.292495255], 'type': 'Point'}",TRUE,6/5/16 23:30,6/5/16 2:55 
53a1f3g44rf7a33ffgh43hh,8/15/16 6:55,"{'coordinates': [16.835441, 97.292495255], 'type': 'Point'}",TRUE,6/6/16 23:30,6/6/16 2:55 
53a1f3g44rf7a33ffgh43hh,8/16/16 6:55,"{'coordinates': [10.835441, 87.292495255], 'type': 'Point'}",TRUE,6/7/16 23:30,6/7/16 2:55""" 

df = pd.read_csv(io.StringIO(doc)) 

def as_tuple(s): 
    return json.loads(s.replace('\'','\"'))['coordinates'] 

def get_coord(x, pos): 
    return as_tuple(x)[pos]  

df.coord0 = df.location.apply(get_coord, args=[0]) 
df.coord1 = df.location.apply(get_coord, args=[1]) 

assert df.coord0.iloc[-1] == 10.835441 
+1

'as_tuple'の' df.location [0] 'は' s'に置き換えてはいけませんか? –

+0

@Evgenyあなたのコードが動作します。あなたのブレイクへの返事が不思議です。 – JAG2024

+1

@BlakeRegalia - 確かにあなたが言っている方法でなければなりません。バグを発見してくれてありがとう –

関連する問題