2016-07-30 23 views
0

私はPandas初心者です。行の最後の列に辞書を追加するコードを書いています。 は、最後の列は、私は私のコードを実行すると、私はエラーメッセージPandas列に一連の文字列を追加します。

TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('S75') dtype('S75') dtype('S75') 

を得るパンダエンジンを傷つける私のコードの「ホルダー」

一部は、

df.loc[df[innercat] == -1, 'Holder'] += str(odata) 

の下に表示されて命名され"+ ="を "="に置き換えるとコードはうまく動作しますが、私は必要なデータの一部しか取得しません。 私は何が間違っていますか? str()キャストを削除しようとしましたが、それは割り当てとしてではなく、追加として機能します。

さらに明確化

Math1 Math1_Notes Physics1 Physics1_Notes Chem1 Chem1_Notes Bio1 Bio1_Notes French1 French1_Notes Spanish1 Spanish1_Notes Holder 
-1 Gr8 student 0      0     0    0     -1  Foo   NaN 
0     0      0     0    0     -1  Good student NaN 
0     0      -1     So so   0     0   0    NaN 
0     -1  Not serious -1     Hooray  -1     Voila   0   NaN 

私の元のデータセットは、データの300以上の列が含まれていますが、私は何をしようとしているの精神をキャプチャする例を作成しました。 1つ(またはそれ以上)のコースを提供する300の学科を持つ大学を想像してみてください。上記のデータはそのデータのミクロサンプルです。したがって、各生徒の名前または入場番号の隣に、あるコースを受講したことを示す「-1」があります。さらに、次の列USUALLYには、その学科のその学生に関するメモが含まれています。

上記のデータの1行目を見ると、学生には&という数式のスペイン語を習った学生がいて、各部門から学生に関するコメントが追加されました。各行について、各学生のデータを要約する辞書を追加したいと思います。基本的に、各部門エントリのJSON要約。私は私のcsvファイルを読むために私のコードを意図する一般的な形式

json_string = {"student name": a, "data": {"notes": b, "Course name": c}} 

の文字列を想定し、各部門の辞書を形成し、ホルダー欄に追加します。したがって、上記の学生(1行目)のために、私は正常にデータを追加することができる場合

{"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}} {"student name": "Peter", "data": {"notes": "Foo", "Course name": "Spanish1"}} 

あろう2枚のすなわちdicts

{"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}} 
{"student name": "Peter", "data": {"notes": "Foo", "Course name": "Spanish1"}} 

を、行1のホルダーの最終的な内容が存在することになりますたぶんカンマか '|'別の言葉の間に私が書いたコードの行は、)私はSTR(上記のようにラインをキャストするかどうかを

df.loc[df[innercat] == -1, 'Holder'] = str(odata) 

で、代わりに追記演算子の割り当てを書くことは、すべての以前の値を上書きし、最後の値だけを書くように見えます私は私がやっていることの再生に興味がある人のために

-1 Gr8 student 0      0     0    0     -1  Foo   {"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}} {"student name": "Peter", "data": {"notes": "Foo", "Course name": "Spanish1"}} 

を望んながらホルダーに、

-1 Gr8 student 0      0     0    0     -1  Foo   {"student name": "Peter", "data": {"notes": "Foo", "Course name": "Spanish1"}} 

のようなもの、私のコードの主要な部分を以下に示します

count = 0 
substrategy = 0 
for cat in col_array: 
    count += 1 
    for innercat in cat:   
     if "Notes" in innercat: 
      #b = str(df[innercat]) 
      continue 
     substrategy += 1 
     c = count 
     a = substrategy 
     odata = {} 
     odata['did'] = a 
     odata['id'] = a   
     odata['data'] = {} 
     odata['data']['notes'] = b 
     odata['data']['substrategy'] = a 
     odata['data']['strategy'] = c 
     df.loc[df[innercat] == -1, 'Holder'] += str(odata) 
+0

あなたはそれが[問題を例示している]こと[サンプルデータ](http://stackoverflow.com/q/20109391/2087463)を作成することができます(http://stackoverflow.com/help/mcve)?特定の問題が何であるかを知ることは難しいでしょう。 – tmthydvnprt

+1

'odata'のdtypeは何ですか?それは文字列シリーズでなければなりません... – MaxU

+0

@MaxU:odataはdictです – user1801060

答えて

1

は何ですか?

In [190]: d1 = {"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}} 

In [191]: d2 = {"student name": "Peter", "data": {"notes": "Foo", "Course name": "Spanish1"}} 

In [192]: import json 

In [193]: json.dumps(d1) 
Out[193]: '{"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}}' 

In [194]: df 
Out[194]: 
    Investments_Cash Holder 
0     0  NaN 
1     0  NaN 
2    -1  NaN 

In [196]: df.Holder = '' 

In [197]: df.ix[df.Investments_Cash == -1, 'Holder'] += json.dumps(d1) 

In [198]: df.ix[df.Investments_Cash == -1, 'Holder'] += ' ' + json.dumps(d2) 

In [199]: df 
Out[199]: 
    Investments_Cash 
        Holder 
0     0 
1     0 
2    -1 {"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}} {"student name": "Peter", "data": {"notes": "Foo", "Course nam... 

注:それは標準ではありませんので、将来的にあなたのHolder列を解析/仕事が本当に痛いだろう - あなたは追加の前処理をせずに戻ってそれを解析することができません(例えば、分割のための複雑な正規表現を使用して

In [201]: df.ix[df.Investments_Cash == -1, 'Holder'] = json.dumps([d1, d2]) 

In [202]: df 
Out[202]: 
    Investments_Cash 
        Holder 
0     0 

1     0 

2    -1 [{"student name": "Peter", "data": {"notes": "Gr8 student", "Course name": "Math1"}}, {"student name": "Peter", "data": {"notes": "Foo", "Course n... 
: - 「ESなど)

は、だから私は強くJSONにdictsのリストを変換するために、あなたをお勧めします、あなたはjson.loads()メソッドを使用して、それを読み取ることができるようになります

それをバック解析:

In [204]: lst = json.loads(df.ix[2, 'Holder']) 

In [205]: lst 
Out[205]: 
[{'data': {'Course name': 'Math1', 'notes': 'Gr8 student'}, 
    'student name': 'Peter'}, 
{'data': {'Course name': 'Spanish1', 'notes': 'Foo'}, 
    'student name': 'Peter'}] 

In [206]: lst[0] 
Out[206]: 
{'data': {'Course name': 'Math1', 'notes': 'Gr8 student'}, 
'student name': 'Peter'} 

In [207]: lst[1] 
Out[207]: {'data': {'Course name': 'Spanish1', 'notes': 'Foo'}, 'student name': 'Peter'} 
+0

@ user1801060、それはまだ明確ではありません。あなたの 'dict1 dict2 dict3'がどのように見えるかを例に挙げてください - それは連結されたdictsの文字列表現ですか?それはディクテーションのリストですか?違うの? [良い再現可能なパンダの例を作る方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)を読んで、それに応じて質問を変更してください。 – MaxU

+0

質問が更新されました – user1801060

+0

@ user1801060 「教師名」:「ピーター」、「データ」:{「ノート」:「Gr8生徒」、「コース名」:「Math1」}} {「学生名」:「ピーター」、「データ」 ":{" notes ":" Foo "、" Course name ":" Spanish1 "}}'?これはpandas/numpy/python dtypeではありません。それは文字列ですか? – MaxU

関連する問題