2014-03-18 1 views
1

API에서 가능한 큰 데이터 잡이를위한 기본 지원 코드를 빌드 중입니다. 결과는 각 색인 값에 대한 dict으로 나타납니다. 즉주문이 중요 할 때 팬더 데이터 프레임을 채우는 가장 빠른 방법

[(index0, {col3:val3, col0:val0, col12:val12, ...}), (index1,{...}), ...] 

그러나 색인이 순서대로 나오지는 않지만. 또한 모든 색인이 반드시 모든 색인에 대해 사용 가능한 것은 아닙니다.

이 열이 올바른 순서 col_list = [col0, col1, ...]뿐만 아니라 index_list = [index0, index1, ...]

내 성향 그냥 dataframe에게

df = DataFrame(index=index_list, columns=col_list) 

을 미리 정의하고 단지 df.loc[idx, col] = val하여 데이터를 할당 할 수있는 모든 인덱스에 결국 중요하다 수도 데이터가 희박한 경우 가장 빠른 방법이 될 수 있습니다. 그러나 데이터는 거의 확실하게 밀도가 있습니다.

상당히 빠른 대체 생성자가 있습니까?

+1

'pd.read_json'을 사용해 보셨습니까? (이 유효한 json입니까?) 실제/가장하지만 재생할 스 니펫을 제공하십시오. –

+0

불행히도, 그것은 json이 아닙니다. API는 비표준이고 다소 불안정하여 위의 다소 애매한 것으로 보았습니다. API가 index0에 cols/vals의 dict을주고 index1과 cols/vals의 dict을주는 것으로 생각하십시오. – rhaskett

+0

그리고 먼저 API에 제공 한 색인 및 색인 목록이 있습니다. – rhaskett

답변

0

아이디어는 dicts 목록에서 데이터를 대량로드하고 나중에 인덱스 열을 정렬하는 것입니다. 팬더는 이런 종류의 것에 최적화되어 있습니다.

첫 번째 튜플 + dicts 목록을 dicts 목록으로 조정해야합니다 (데이터 프레임을 쉽게 초기화 할 수 있도록).

your_data = [(2,{"col1":2,"col2":3}),(-1,{"col3":22,"col1":4})] 
dict = [x[1].update({"idx_col":x[0]}) or x[1] for x in your_data] 
dict>> [{'col1': 2, 'col2': 3, 'idx_col': 2}, {'col1': 4, 'col3': 22, 'idx_col': -1}] 

다음 :

df = pd.DataFrame(columns=["col1","col2","col3"]) #not necessary if every col appears 
#at least once in the data 
df = df.append([{"idx_col":2,"col1":2,"col2":3},{"idx_col":-1,"col3":22,"col1":4}])  
#column order preserved 

df = df.set_index("idx_col",drop=True).sort() #index order preserved now 

그렇게하는 한 가지 방법 (한 줄)이 (당신이 그들을 전에 구문 분석 방식을 제어 할 수 없다는 및 형식이 예에서와 같이이라고 가정)입니다 결과 DF : 여러 인덱스 열이있는 경우

  col1 col2 col3 
idx_col     
-1   4 NaN 22 
2   2  3 NaN 

단지 배열 사용 [ "idx0", "IDX1을"...]을 set_index 방법에 (당신의 예제는 하나 개의 인덱스가 믿고 날 리드 있지만)

+0

이것은 흥미 롭습니다. 나는 속도 문제를 여기에서 이해하려고 노력하고있다. 나는 여러 장의 뒤에서 어떤 일이 일어나는지 걱정 스럽다. 이것은 dict [col_name] [index_name]을 채우는 것보다 빠르고 from_dict 다음에 reindex를 사용하는 것보다 빠릅니까? – rhaskett

+0

어쩌면 추가가 한꺼번에 완료되기 때문에 나쁘지 않을 수도 있습니다 ... – rhaskett

+0

append를 호출하지 않고 dicts 목록으로 데이터 프레임을 초기화 할 수도 있습니다. 즉 df = pd.DataFrame ([dict1, dict2, ...]) ])하지만 성능 차이가 없다고 생각합니다. – grasshopper

관련 문제