2014-06-20 1 views
1

나는 꽤 커서 numpy.ndarray입니다. 기본적으로 배열의 배열입니다. pandas.DataFrame으로 변환하고 싶습니다. 내가 뭘 원하는 내가 외부 배열의 인덱스 및 특정 ID를 얻기 위해 두 DataFrame의 지수에 내부 배열을 매핑하고2D numpy.ndarray를 pandas.DataFrame으로 변환하십시오.

from pandas import DataFrame 

cache1 = DataFrame([{'id1': 'ABC1234'}, {'id1': 'NCMN7838'}]) 
cache2 = DataFrame([{'id2': 3276827}, {'id2': 98567498}, {'id2': 38472837}]) 

ndarr = [[4.3, 5.6, 6.7], [3.2, 4.5, 2.1]] 
arr = [] 
for idx, i in enumerate(ndarr): 
    id1 = cache1.ix[idx].id1 
    for idx2, val in enumerate(i): 
     id2 = cache2.ix[idx2].id2 
     if val > 0: 
      arr.append(dict(id1=id1, id2=id2, value=val)) 
df = DataFrame(arr) 
print(df.head()) 

아래의 코드입니다. cache1cache2pandas.DataFrame입니다. 각 행은 ~100k 행입니다.

이 작업은 완료하는 데 몇 시간이 걸리며 정말 오래 걸립니다. 속도를 낼 수있는 방법이 있습니까? 이 같은

+0

코드를 그대로 복사했습니다. 'cache1 [ 'A']'는 내부적 인 것 (기본적으로 캐시의 열쇠) 이었기 때문에 혼란 스러웠습니다. 나는 지금 그것을 바로 잡았다. – y2p

+0

SSCCE – y2p

+0

으로 업데이트되었습니다. 'cache2'의 마지막 항목입니다.'{'id ': 38472837} 대신'{'id2 ': 38472837}'이어야합니까? –

답변

1

나는 2D np.array로 표현하면 ncache1.id1m의 길이 cache2.id2의 길이 어디에 ndarr는, 항상 n,m의 모양을 가지고 생각한다. 그리고 cache2의 마지막 항목은 {'id': 38472837} 대신 {'id2': 38472837}이되어야합니다. 이 경우, 다음과 같은 간단한 해결책은 필요한 것을 모두 할 수있다 :

In [30]: 

df=pd.DataFrame(np.array(ndarr).ravel(), 
      index=pd.MultiIndex.from_product([cache1.id1.values, cache2.id2.values],names=['idx1', 'idx2']), 
      columns=['val']) 
In [33]: 

print df.reset_index() 
     idx1  idx2 val 
0 ABC1234 3276827 4.3 
1 ABC1234 98567498 5.6 
2 ABC1234 38472837 6.7 
3 NCMN7838 3276827 3.2 
4 NCMN7838 98567498 4.5 
5 NCMN7838 38472837 2.1 

[6 rows x 3 columns] 

사실, 나 또한 생각의 MultiIndex 더 좋은 생각이 될 수 있습니다 가지고 그것을 유지하는.

0

뭔가 작업을해야합니다 :

ndarr = np.asarray(ndarr) # if ndarr is actually an array, skip this 
fast_df = pd.DataFrame({"value": ndarr.ravel()}) 
i1, i2 = [i.ravel() for i in np.indices(ndarr.shape)] 
fast_df["id1"] = cache1["id1"].loc[i1].values 
fast_df["id2"] = cache2["id2"].loc[i2].values 

>>> fast_df 
    value  id1  id2 
0 4.3 ABC1234 3276827 
1 5.6 ABC1234 98567498 
2 6.7 ABC1234  NaN 
3 3.2 NCMN7838 3276827 
4 4.5 NCMN7838 98567498 
5 2.1 NCMN7838  NaN 

를 제공하는 그리고 당신이 정말로 0 값을 삭제하려면 다음, 당신은 fast_df = fast_df[fast_df['value'] != 0]를 사용하는 경우에만 제로가 아닌 사람을 유지할 수 있습니다.

+0

완벽 고마워 – y2p

관련 문제