2017-01-16 1 views
1

두 개의 배열 AB에 일련의 숫자가 포함되어 있습니다. 예를 들어 A.팬더의 배열에서 데이터 프레임 생성을 향상시키는 방법

의 모든 값에 상응 할 BI의 각 요소 : I는 다음 쌍을 가져올 A = [0,2,5] 경우 B=[4,9,8]

내 목표는 다음과 같은 구조를 갖는 dataframe을 만드는 것이다 0-4,0-9,0-8, 2-4,2-9,2-85-4,5-9,5-8.

import pandas as pd 
import numpy as np 

a, b = 1, 10 
c, d = -10, -1 
step = 0.5 

A = np.arange(a,b,1)+step 
B = np.arange(c,d,1) 

df = pd.DataFrame() 
for j in B: 
    for i in A: 
     name = 'H'+str(int(np.abs(i)))+str(int(np.abs(j))) 
     dic = {'XXX':[i],'YYY':[j],'ZZZ':name} 
     df = pd.concat([df,pd.DataFrame(dic)],ignore_index=True) 

ZZZ하지만, 위의 그림과 같이 계산할 수 :

나는 다음과 같은 방법으로 내 목표를 달성 할 수 있었다.

내가 작성한 코드는 정상적으로 작동하지만 a,b,c,d 값을 늘리면 속도가 느려집니다.

내 목표를 달성하는보다 우아한 방법이 있습니까? 중첩 된 for 루프는 피하고 싶습니다. 분명히 내 방식보다 효율적입니다.

+1

당신이 [우편] (HTTPS를 사용하여 목록을 결합 할 수 있습니다 : // 문서 zip (A, B)와 같이 pandas의 열을 직접 연결할 수 있습니다. df.XXX.astype (str) + df.YYY.astype (str) 새로운 컬럼. – BMW

+0

mmm 나는 그것에 대해 들어 본 적이 없어요 ... 지금 당장 살펴 보겠습니다. –

답변

1

itertools.product으로 모든 조합을 만들 수 있습니다. 열 XXX를 들어

float 다음 int하고 변환 제거 진수, YYYstr에 절대 값 및 캐스트를 얻을 FOM 컬럼에 대한 str에 :

from itertools import product 
df = pd.DataFrame(list(product(B, A)), columns=['YYY','XXX']) 
#swap columns 
df = df[['XXX','YYY']] 
df['ZZZ'] = 'H' + df.XXX.astype(int).astype(str) + df.YYY.abs().astype(str) 

print (df.head(20)) 
    XXX YYY ZZZ 
0 1.5 -10 H110 
1 2.5 -10 H210 
2 3.5 -10 H310 
3 4.5 -10 H410 
4 5.5 -10 H510 
5 6.5 -10 H610 
6 7.5 -10 H710 
7 8.5 -10 H810 
8 9.5 -10 H910 
9 1.5 -9 H19 
10 2.5 -9 H29 
11 3.5 -9 H39 
12 4.5 -9 H49 
13 5.5 -9 H59 
14 6.5 -9 H69 
15 7.5 -9 H79 
16 8.5 -9 H89 
17 9.5 -9 H99 
18 1.5 -8 H18 
19 2.5 -8 H28 
+0

ok 대단히 감사합니다. :) 0에서 끝까지가는 인덱스 솟아를 고칠 수 있겠습니까? –

+0

예, 편집을 참조하십시오. – jezrael

+1

더 나은 해결책을 찾았습니다. 답을 확인하십시오. – jezrael

관련 문제