2016-07-30 8 views
0

저는 팬더 초보자이며 행의 마지막 열에 사전을 추가해야하는 코드를 작성했습니다. 마지막 열은 "홀더"팬더 엔진은 내가팬더 열에 일련의 문자열을 추가합니다.

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"이 있습니다. 그리고 다음 칼럼에는 그 학생에 관한 해당 부서의 메모가 포함되어 있습니다.

위 데이터의 첫 번째 행을 보면 수학이 & 인 학생이 있으며 각학과에서 학생에 대한 의견을 추가했습니다. 각 행에 대해 각 학생의 데이터를 요약 한 사전을 추가하고 싶습니다. 기본적으로 각 부서 항목에 대한 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 홀더의 최종 내용이있을 것 아마 쉼표 또는 '|' 분리 된 딕트 사이에. 내가 작성한 코드 줄 내가 APPEND 운영자가 모든 이전 값을 덮어 쓰기 마지막 값을 쓰고 나타나는 대신 할당을 기록, 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... 
,536,913 : - 'ES 등)

그래서 내가 강하게 JSON에 dicts의 목록을 변환하는 당신을 추천 할 것입니다 당신은 json.loads() 방법을 사용하여 다시 읽을 수 있습니다 63,210

구문 분석을 다시 :

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 "}} {"학생 이름 ":"피터 ","데이터 ": {"메모 ":"푸 ","코스 이름 ":"스페인어 1 "}}'? pandas/numpy/python dtype이 아닙니다. 그것은 문자열인가? – MaxU

관련 문제