2017-11-03 1 views
1

필자는 필요한 데이터를 추출한 Facebook API (v2.10)를 사용하고 있으며 그 중 95 %가 완벽합니다. 내 문제는 'actions'입니다.이 메트릭은 다른 사전의 목록에서 사전으로 반환됩니다.추출 JSON | API | Pandas DataFrame

현재 모든 데이터는 DataFrame에 있지만 'actions'열은 해당 날짜의 개별 작업이 포함 된 사전 목록입니다.

{ 
    "actions": [ 
     { 
      "action_type": "offsite_conversion.custom.xxxxxxxxxxx", 
      "value": "7" 
     }, 
     { 
      "action_type": "offsite_conversion.custom.xxxxxxxxxxx", 
      "value": "3" 
     }, 
     { 
      "action_type": "offsite_conversion.custom.xxxxxxxxxxx", 
      "value": "144" 
     }, 
     { 
      "action_type": "offsite_conversion.custom.xxxxxxxxxxx", 
      "value": "34" 
     }]} 

이 모든 DataFrame 내 하나의 셀 (행)에 나타난다.

  • 가 열 이름으로 사용 "ACTION_TYPE"를, 작업 유형을 가져옵니다 새 열을 생성하고 사용

    하는 가장 좋은 방법은 무엇입니까?

  • 목록이 열

그것은 JSON처럼 보이지만 내가 유형을 볼 때, 그것은 (객체로 저장) 팬더 시리즈의 아래에 올바른 값.

도움을 주려는 분들 (고맙습니다, 대단히 감사합니다) - 올바른 소재의 방향으로 나를 가리키면 읽을 수있을뿐만 아니라 독자적으로 읽을 수도 있습니까 (완전히 확신 할 수는 없습니다). 찾으려는 대상) 또는 쉬운 문제라고 판단되면 어떻게 그리고 왜이 방법으로 해결했는지 설명하십시오. 그냥 대답을 원하지 마라.

나는 (친구의 도움을 받아) 다음과 같은 시도를 해봤지만 일종의 일을했지만이 스크립트는 실행에 문제가있다. IE는 : 그것은 더 큰 코드 블록 내에서 실행하면, 나는 다음과 같은 오류 얻을 : 나는 CSV로 DF를 저장하면,

for i in range(df.shape[0]): 
    line = df.loc[i, 'Conversions'] 
    L = ast.literal_eval(line) 
    for l in L: 
     cid = l['action_type'] 
     value = l['value'] 
     df.loc[i, cid] = value 

pd.read_csv를 사용하여 전화 ... 제대로 있지만 스크립트 내에서 실행됩니다. 이유는 모르겠다.

오류 :

ValueError: malformed node or string: [{'value': '1', 'action_type': 'offsite_conversion.custom.xxxxx}] 

어떤 도움을 크게 감상 할 수있다. 당신은 json_normalize을 사용할 수 있습니다

감사합니다, 아드리안

+0

이 하나의 세포가, 즉 당신은 이들의 전체 열이 당신은 어떻게 든 그들을 확장하려는? –

+0

해당 날짜, 광고 그룹, 연령, 성별 등을 기준으로 214 개의 개별 셀로 구성된이 하나의 열은 개별 작업을 확장하고 고유 한 열을 만들고 싶습니다. – AdrianC

답변

0

는 :

In [11]: d # e.g. dict from json.load OR instead pass the json path to json_normalize 
Out[11]: 
{'actions': [{'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 
    'value': '7'}, 
    {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '3'}, 
    {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '144'}, 
    {'action_type': 'offsite_conversion.custom.xxxxxxxxxxx', 'value': '34'}]} 

In [12]: pd.io.json.json_normalize(d, record_path="actions") 
Out[12]: 
          action_type value 
0 offsite_conversion.custom.xxxxxxxxxxx  7 
1 offsite_conversion.custom.xxxxxxxxxxx  3 
2 offsite_conversion.custom.xxxxxxxxxxx 144 
3 offsite_conversion.custom.xxxxxxxxxxx 34 
+0

감사합니다. 도움을 주셔서 감사합니다. I는 아래하여 상기 복제 시도한 : 'D = 안양 ['전환 ']'' pd.io.json.json_normalize (d, record_path = "작업")' 다음을 반환 오류 : TypeError : 목록 인덱스는 정수 또는 조각이어야하며 str이 아니어야합니다. JSON처럼 보이지만 실제로 뭔가를 놓치지 않는 한 실제로는 pandas 시리즈 (객체)를 반환합니다. – AdrianC

+0

@AdrianC 다음과 같은 형태입니까? df.actions.apply (lambda x : pd.Series ({a [ "action_type"] : a [ "actions"]})) 당신이 원하는 그? –

+0

감사합니다 (다시) Andy! 나는 이것을 시도했지만, 같은 오류를 반환 유지합니다. 'TypeError :리스트 인덱스는 str이 아닌 정수 또는 조각이어야합니다.' 위에서 수행 한 작업은 가까운 행이지만 행 대신 실행하려면 – AdrianC

0

당신은 df.join(pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action_type', values='value').reset_index(drop=True))를 사용할 수 있습니다.

설명 : df['Conversions'].tolist()은 사전 목록을 반환합니다. 그런 다음이 목록은 pd.DataFrame을 사용하여 DataFrame으로 변환됩니다. 그런 다음 pivot function을 사용하여 표를 원하는 모양으로 피벗 할 수 있습니다.

마지막으로 테이블을 원래 DataFrame과 조인 할 수 있습니다. DataFrame의 색인이 기본값 (즉, 0부터 시작하는 정수) 인 경우에만 작동합니다. 그렇지 않은 경우, 대신이 작업을 수행 할 수 있습니다

df2 = pd.DataFrame(df['Conversions'].tolist()).pivot(columns='action_type', values='value').reset_index(drop=True) for col in df2.columns: df[col] = df2[col]

+0

이것은 실제로 매우 가깝지만 action_type을 셀의 열 이름과 값으로 원합니다. – AdrianC

+0

나는 나의 대답을 편집했다. 이게 당신의 문제를 해결합니까? –

+0

감사합니다. Rishabh! 슬프게도, 아니. 다음과 같은 오류가 발생합니다 :'KeyError : 'value' 위의 예외를 처리하는 동안 또 다른 예외가 발생했습니다 : ' – AdrianC