2016-04-14 28 views
0

私はcsvファイルの行に1つの列に命令が入っている場合、python(3。+)/ pandas(.18)を使用して各ordersdictの1つの要素を抽出する方法を教えてください。Ordereddictsの配列から値を抽出する方法は?

例を示します。私の列attributesは、billingPostalCodesがordereddictsに隠されています。私が気にするのは、billingPostalCodesの列を作成することだけです。

dict = OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')]) 

print(dict['BillingPostalCode']) 

私が買ってあげる:私はこれを行う場合

id attributes 
    1 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'85020')]) 
    2 OrderedDict([(u'attributes', OrderedDict([(u'type', u'Account'), (u'url', u'/services/data/v29.0/sobjects/Account/001d000001tKZmWAAW')])), (u'BillingPostalCode', u'55555')]) 
    ... 

私は個人レベルで知っている:

import pandas as pd 
from datetime import datetime 
import csv 
from collections import OrderedDict 

df = pd.read_csv('sf_account_sites.csv') 
print(df) 

利回り:

は、ここに私のデータは今のようになります結果として85020を返します。

このようにするにはどうすればよいですか?

id zip_codes 
    1 85020 
    2 55555 
    ... 

適用機能を使用する必要がありますか? forループ?私はいろいろなことを試しましたが、データフレームでは何もできません。

私はより具体的にする必要がある場合は、事前に感謝し、私に教えてください。

答えて

0

これが動作するように私にしばらく時間がかかったが、問題は、以下を実行することで解決されます。

df.apply(lambda row: row["attributes"]["BillingPostalCode"], axis = 1) 

ここでのトリックではなく、各欄より、axis = 1pandasは、すべての行を反復処理することに注意することがあります(docsに示されているように、デフォルトの設定です)。この場合attributesに - - そこから

DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

Applies function along input axis of DataFrame.

Objects passed to functions are Series objects having index either the DataFrame’s index (axis=0) or the columns (axis=1). Return type depends on whether passed function aggregates, or the reduce argument if the DataFrame is empty.

Parameters:

  • func : function Function to apply to each column/row
  • axis : {0 or ‘index’, 1 or ‘columns’}, default 0
    • 0 or ‘index’: apply function to each column
    • 1 or ‘columns’: apply function to each row

は、最初に関連する列を抽出するのは簡単なことであるし、そこからのみBillingPostalCodeを抽出します。

結果のDataFrameを正しい列名にフォーマットする必要があります。

+0

これはうまくいくようですが、これを試してみると 'TypeError :('文字列インデックスは整数でなければなりません'、 'インデックス0で発生しました')'なぜこれが当てはまるのでしょうか? –

+0

@AndrewKraemer引用した例でこれをテストしたところ、うまくいきました。使用しているパンダのバージョンは何ですか?私はパンダス0.18です。私はこのような列名ではなく、整数で発生するようなパンダの行インデックスの古いバージョンではないと思われる。代わりに 'row [1] [" BillingPostalCode "]'を試してください。 –

+0

私は本当に.18です。私はあなたが推薦したものを実行し、同じ問題を抱えていました。実際のデータセットをアップロードすることができれば助かります。属性列のデータは文字列として保存されているように見えます。ここでは、これはcollections.OrderedDictで動作する必要があります。文字列をOderedDictに変換する方法がわかりません。 –

関連する問題