2016-12-07 10 views
1

の値に基づいて、パンダのデータフレームの列に辞書を追加する:は、私はこれに似たパンダのデータフレームを持っている辞書

import pandas as pd 

members = [('Chicago', 'IL', '1058'), ('New York', 'NY', '3425'), 
      ('St. Louis', 'MO', '8854')] 
labels = ['City', 'State', 'member_id'] 
df = pd.DataFrame.from_records(members, columns = labels) 

    City  State member_id 
0 Chicago IL  1058 
1 New York NY  3425 
2 St. Louis MO  8854 

私も、これと同様のデータフレームよりも短くなっている辞書のリストを、持っています:

リストにある辞書を、idに基づいて 'new_col'というデータフレーム内の新しい列に挿入したいとします。この場合、辞書の 'id'はデータフレームの 'member_id'に関連します。さらに、出力には辞書を追加した行のみが含まれている必要があります。

期待される出力は、このようなものになるだろう:私はちょうどそれらの値を持つ新しいデータフレームを作成しようとした

City  State member_id new_col 
0 Chicago IL  1058  {'name':'Tom', 'age':'37', 'id':'1058'} 
1 New York NY  3425  {'name':'Sue', 'age':'24', 'id':'3425'} 

が、二つを接続するために見えることはできません。私はので、シリーズと互換性のないインデクサーを、私はそれについて心配していない:それはとValueErrorを発生させ

df['new_col'] = None 
for key, value in df['member_id'].iteritems(): 
    for n in x: 
     id = str(n['id']) 
     if id == str(value): 
      df.loc[key, 'new_col'] = n 
df = df[(df['new_col'] != None)] 

:私はまた、新しい列を追加し、その後濾過される、反復することにより、辞書を追加しようとしました私の全体的なアプローチが間違っていると思います。 forループ内のループよりも簡単な方法が必要です。特に、これは非常に大きなデータセットです。これを達成する最もクリーンな方法は何ですか?

答えて

2

あなたはキーiddictdictによってmapを使用することができます。

print ({int(i['id']):i for i in x}) 
{3425: {'id': '3425', 'age': '24', 'name': 'Sue'}, 
1058: {'id': '1058', 'age': '37', 'name': 'Tom'}} 

df['new'] = df.member_id.map({int(i['id']):i for i in x}) 
print (df) 
     City State member_id           new 
0 Chicago IL  1058 {'id': '1058', 'age': '37', 'name': 'Tom'} 
1 New York NY  3425 {'id': '3425', 'age': '24', 'name': 'Sue'} 
2 St. Louis MO  8854           NaN 

最終dropnaを追加new欄にNaNで行を削除が必要な場合:

df['new'] = df.member_id.map({int(i['id']):i for i in x}) 
df = df.dropna(subset=['new']) 
print (df) 
     City State member_id           new 
0 Chicago IL  1058 {'id': '1058', 'age': '37', 'name': 'Tom'} 
1 New York NY  3425 {'id': '3425', 'age': '24', 'name': 'Sue'} 
+0

私のデータは実際にmember_idを文字列として持っていましたが、それはint()を取り出して簡単に修正できました。あなたは何時間もの苦しみを終わらせました。ありがとうございました! – mightyoscar

1

s_x = pd.Series(x) 
s_x.index = s_x.apply(lambda x:int(x['id'])) 
new_df = df.set_index('member_id') 
new_df = pd.concat([new_df, s_x],axis=1) 
print new_df 

出力されたデータの2つのソースは、インデックスを共有するようにしてください:

 City State 0 
1058 Chicago IL {u'age': u'37', u'name': u'Tom', u'id': u'1058'} 
3425 NewYork NY {u'age': u'24', u'name': u'Sue', u'id': u'3425'} 
8854 StLouis MO NaN 

しかし、より有用で行うことにより、カラムとしてdictのキーを作るために次のようになります。

df_x = pd.DataFrame(x) 
df_x.index = df_x['id'].astype('int32') 
new_df = df.set_index('member_id') 
new_df = pd.concat([new_df, df_x],axis=1) 
print new_df 

出力は:

 City  State age id name 
1058 Chicago IL 37 1058 Tom 
3425 NewYork NY 24 3425 Sue 
8854 StLouis MO NaN NaN NaN 
+0

は、あなたはそれが正しいですか? 'member_id'で' id'を結合しません。 – jezrael

+0

申し訳ありませんが、より明確になっているはずです。辞書は特定の順序ではないので、私は 'id'と 'member_id'をリンクする必要があります。長さが異なるため、長さの値の誤差も残ります。私はその質問を編集しました。 – mightyoscar

+0

それに気付かなかった。私はまもなく修正を投稿します – yuval

関連する問題