2016-09-20 21 views
2

私のデータは次のようになります。私はパンダのデータフレームに変換したいパンダのデータフレームに辞書を変換し

{u'"57e01311817bc367c030b390"': u'{"ad_since": 2016, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}', u'"57e01311817bc367c030b3a8"': u'{"ad_since": 2012, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}'} 

。私は単一の列を取得できますか

      0      1 
0 "57e01311817bc367c030b390" {"ad_since": 2016, "indoor_swimming_pool": "No... 
1 "57e01311817bc367c030b3a8" {"ad_since": 2012, "indoor_swimming_pool": "No... 

:私は

df = pd.DataFrame(response.items()) 

をしようとすると、しかし、私は、2つの列を持つデータフレーム、最初のキーを持つ最初の、そしてキーの値を持つ第二の取得します各キーについて:"ad_since","indoor_swimming_pool","indoor_swimming_pool"?そして、最初の列を保持するか、idをインデックスとして取得します。

+0

try read_json http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.read_json.html –

+0

サンプルデータを 'pd.DataFrame(response.items())'で試してみますか? ?私にとっては、それは仕事をしません。 – jezrael

+0

@jezraelコメントをいただき、ありがとうございました投稿を編集しました – mitsi

答えて

1

あなたは.apply(literal_eval).apply(json.loads)によりdicttypestrの列を変換してからDataFrame.from_recordsを使用する必要があります。

import pandas as pd 
from ast import literal_eval 

response = {u'"57e01311817bc367c030b390"': u'{"ad_since": 2016, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}', 
      u'"57e01311817bc367c030b3a8"': u'{"ad_since": 2012, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}'} 

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

print (type(df.iloc[0,0])) 
<class 'str'> 

df.iloc[:,0] = df.iloc[:,0].apply(literal_eval) 

print (pd.DataFrame.from_records(df.iloc[:,0].values.tolist(), index=df.index)) 
          ad_since handicapped_access indoor_swimming_pool \ 
"57e01311817bc367c030b3a8"  2012    Yes     No 
"57e01311817bc367c030b390"  2016    Yes     No 

          seaside 
"57e01311817bc367c030b3a8"  No 
"57e01311817bc367c030b390"  No 

import pandas as pd 
import json 

response = {u'"57e01311817bc367c030b390"': u'{"ad_since": 2016, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}', 
      u'"57e01311817bc367c030b3a8"': u'{"ad_since": 2012, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}'} 


df = pd.DataFrame.from_dict(response, orient='index') 
df.iloc[:,0] = df.iloc[:,0].apply(json.loads) 


print (pd.DataFrame.from_records(df.iloc[:,0].values.tolist(), index=df.index)) 
          ad_since handicapped_access indoor_swimming_pool \ 
"57e01311817bc367c030b3a8"  2012    Yes     No 
"57e01311817bc367c030b390"  2016    Yes     No 

          seaside 
"57e01311817bc367c030b3a8"  No 
"57e01311817bc367c030b390"  No 
+0

最初のメソッド( 'literal_eval'を使って)とデータセット全体で、おそらく特殊文字のために' ValueError:malformed string'というエラーが出ました。しかし、 'json.loads'の2番目のメソッドと完全に動作します。 – mitsi

+0

うれしいことがあります。 – jezrael

1

値が文字列であるとして、あなたはjson moduleとリスト内包表記を使用することができます。

In [20]: d =  {u'"57e01311817bc367c030b390"': u'{"ad_since": 2016, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}', u'"57e01311817bc367c030b3a8"': u'{"ad_since": 2012, "indoor_swimming_pool": "No", "seaside": "No", "handicapped_access": "Yes"}'} 

In [21]: import json 

In [22]: pd.DataFrame(dict([(k, [json.loads(e)[k] for e in d.values()]) for k in json.loads(d.values()[0])]), index=d.keys())Out[22]: 
          ad_since handicapped_access indoor_swimming_pool \ 
"57e01311817bc367c030b390"  2016    Yes     No 
"57e01311817bc367c030b3a8"  2012    Yes     No 

         seaside 
"57e01311817bc367c030b390"  No 
"57e01311817bc367c030b3a8"  No 
関連する問題