2016-12-18 13 views
3

하나의 열이 JSON으로 저장되는 데이터베이스 (50k + 행)에서 데이터를 읽습니다. 팬더 데이터 프레임으로 추출하고 싶습니다. 아래 스 니펫은 정상적으로 작동하지만 상당히 비효율적이며 전체 db에 대해 실행할 때 영원히 필요합니다. 모든 항목이 동일한 속성을 갖고있는 것은 아니며 JSON에 일부 중첩 된 속성이 있음에 유의하십시오.JSON 열을 Pandas 데이터 프레임으로 빨리 변환

어떻게하면 더 빨리 만들 수 있습니까?

df = pd.read_csv('http://pastebin.com/raw/7L86m9R2', \ 
       header=None, index_col=0, names=['data']) 

a = df.data.apply(json.loads).values.tolist() 
print (pd.DataFrame.from_records(a)) 
+1

는'df.data.apply겠습니까 설정 (람다 X : pd.Series (json.loads은 (X)))'합니까? – Zero

+0

붙여 넣은 데이터를 다른 종류의 표준 형식으로 저장할 수 있습니까? – MaxU

+0

@JohnGalt : 작동하지만 dict을 병합하지 않습니다. – jodoox

답변

3

json_normalize가 이미 처리 JSON 문자열 또는의 팬더 시리즈를 취

import pandas as pd 
import json 

df = pd.read_csv('http://pastebin.com/raw/7L86m9R2', \ 
       header=None, index_col=0, names=['data']) 

df.data.apply(json.loads) \ 
     .apply(pd.io.json.json_normalize)\ 
     .pipe(lambda x: pd.concat(x.values)) 
###this returns a dataframe where each JSON key is a column 
+0

감사합니다. 그게 첫 번째 솔루션보다 빠릅니다;) – jodoox

+0

'DataFrame'객체에 'data'속성이 없습니다. –

2

난 당신이 먼저 values과 마지막 DataFrame.from_records에 의해 numpy arrayslist를 작성, datadictstring 열을 변환 할 수 있습니다 생각 문자열.

pd.io.json.json_normalize(df.data.apply(json.loads)) 

import pandas as pd 
import json 

df = pd.read_csv('http://pastebin.com/raw/7L86m9R2', \ 
       header=None, index_col=0, names=['data']) 
+0

고마워요. 내 초기 접근 방식보다 100 배 빠릅니다. 유일한 문제는 이것이 중첩 된 dicts를 확장하지 않는다는 것입니다. 그게 가능할까요? – jodoox

+0

다른 답변보기) – jezrael

관련 문제