2014-04-04 3 views
2

다중 열 데이터 프레임이 있다고 가정하고 첫 번째 열이있는 경우 첫 번째 열을 가져오고 두 번째 열을 보면 폭포수 스타일 알고리즘을 구현하고자합니다 그렇지 않다면 세 번째 열의 값을 취하고 마지막 열에 누락 된 값이 기본값 (예 : 0)을 갖는지 확인합니다. 일련의 벡터 연산을 추가하는 방법이 있지만 (아래 참조) 더 많은 열로 확장하지는 않습니다. 물론 나는 (매우 unpythonic - 괜찮아?) 행을 중첩 루프와 함께 할 수있는 내가 임의의 길이의 폭포로도 확장이 문제에 대한 해결책을 기대하고팬더 데이터 프레임에서 여러 열의 폭포수 알고리즘 구성

frame = pd.DataFrame(np.arange(15).reshape((5,3)),index=['a','b','c','d','e'],columns=['X','Y', 'Z']) 
#Make some missing values 
frame['X'].ix[0:2] = None 
frame['Y'].ix[1:4] = None 
frame['Z'].ix[3:5] = None 
#This is my kludgy waterfall for the three column case. 
frame['Waterfall'] = frame['X'].fillna(0) + frame['Y'].fillna(0) * frame['X'].isnull() + frame['Z'].fillna(0) * (frame['X'].isnull() & frame['Y'].isnull()) 

. 그것이 더 위대한 Pythonic 일 수 있다면. 이상적으로는, 데이터 프레임을 인수로 사용하여 열 레이블의 정렬 된 목록을 취하여 원하는 값을 반환하는 함수가 이상적입니다.

도움 주셔서 감사합니다.

답변

2

먼저 누락 된 데이터 값으로 None을 사용하지 마십시오. 이렇게하면 모든 열이 object dtype으로 강제 설정되기 때문에 속도가 느려집니다. 대신 (이 모든 것을 doubles 그래서 그냥 점 물건 부동 조심해야한다 nan를 사용

내가 fillna()bfill 방법을 사용하십시오 :.

In [26]: frame.fillna(method='bfill', axis=1)['X'].fillna(0) 
Out[26]: 
a  1 
b  5 
c  6 
d  9 
e 12 
Name: X, dtype: float64 

성능 :

In [27]: %timeit frame['X'].fillna(0) + frame['Y'].fillna(0) * frame['X'].isnull() + frame['Z'].fillna(0) * (frame['X'].isnull() & fra 
me['Y'].isnull()) 

1000 loops, best of 3: 776 µs per loop 

In [28]: %timeit frame.fillna(method='bfill', axis=1)['X'] 
10000 loops, best of 3: 138 µs per loop 
+0

을하지만 일반적으로 우리 모든 열에서 채우기를 원하지 않으며 폭포 순서가 프레임 순서가되지 않습니다. 올바른 순서로 생성 된 서브 프레임에서 fillna를 사용 하시겠습니까? – BKay

+0

대소 문자의 끝에'.fillna (0)'을 호출하십시오. 여기서 전체 행은 NaN입니다. 왜 그것이 올바른 순서로되지 않습니까? – TomAugspurger

+0

어쩌면 OP가''combine_first''보다 감소를 원합니까? – Jeff

관련 문제