2014-12-04 9 views
1

나가 수에서 다를 수 있습니다 열 사이의 비교를 기반으로 팬더의 열을 만들려고 해요이 할 수있는 가장 빠른, 가장 깨끗한 방법을 생각하는 것을 시도하고있다 :팬더 비교

id  date  birth_date_1 birth_date_2 
1 1/1/2000 1/3/2000  1/5/2000 
1 1/7/2000 1/3/2000  1/5/2000 
2 1/2/2000 1/10/2000  1/1/2000 
2 1/5/2000 1/10/2000  1/1/2000 
3 1/4/2000  NaT   NaT 

id  date  birth_date_1 birth_date_2 num_born_before_date 
1 1/1/2000 1/3/2000  1/5/2000    0 
1 1/7/2000 1/3/2000  1/5/2000    2 
2 1/2/2000 1/10/2000  1/1/2000   1 
2 1/5/2000 1/10/2000  1/1/2000   1 
3 1/4/2000  NaT   NaT    0 

주의해야 할 점은 birth_date 컬럼의 수를 실행하는 실행에 따라 다를 것입니다 :

나는 현재 날짜 이전에 출생 날짜의 수를 계산 새 열을 생성하는 것을 목표로하고 있습니다. 나는 광란하게 느려질 것이므로 엔트리를 반복하고 싶지 않다 ...

편집 : np.where을 사용하여 약간 더러운 해킹이 일어났다. 특히 NaT를 다루는 측면에서이 작업을 수행하는 더 좋은 방법이 있는지 확실하지 않습니다.

NAT2 = pd.to_datetime('01-01-2100') # need this to deal with NaTs 
df = df.fillna(NAT2) 

df['num_born'] = 0 
created_cols = [c for c in df.columns if 'birth_date' in c] 

for col in created_cols: 
    df['num_born'] = np.where((df['date'] >= df[col]), 
           df['num_born'] + 1, df['num_born']) 
df = df.replace(to_replace=NAT2, value=pd.NaT) 

답변

1

그래서 dataframe가 (당신이 그것에 대해 to_datetime를 사용하거나, 예를 들어 read_csvparse_dates를 지정할 수 있습니다) 날짜 시간 열을 분석 한 가정 : 이제 확인할 수 있습니다

In [64]: df 
Out[64]: 
    id  date birth_date_1 birth_date_2 
0 1 2000-01-01 2000-01-03 2000-01-05 
1 1 2000-01-07 2000-01-03 2000-01-05 
2 2 2000-01-02 2000-01-10 2000-01-01 
3 2 2000-01-05 2000-01-10 2000-01-01 

곳 'birth_date의 값 날짜 '열'은 컬럼의 값보다 낮은 '다음 계산을 사용 sum : DEA에

In [65]: df[['birth_date_1', 'birth_date_2']].lt(df['date'], axis=0) 
Out[65]: 
    birth_date_1 birth_date_2 
0  False  False 
1   True   True 
2  False   True 
3  False   True 

In [66]: df[['birth_date_1', 'birth_date_2']].lt(df['date'], axis=0).sum(axis=1) 

Out[66]: 
0 0 
1 2 
2 1 
3 1 
dtype: int64 

'birth_date'컬럼의 다양한 수의 난, 당신은 다음과 같이 filter 자동으로이 작업을 수행 할 수 있습니다

In [67]: df.filter(like="birth_date") 
Out[67]: 
    birth_date_1 birth_date_2 
0 2000-01-03 2000-01-05 
1 2000-01-03 2000-01-05 
2 2000-01-10 2000-01-01 
3 2000-01-10 2000-01-01 

전부,이 줄 것이다 :

In [66]: df.filter(like="birth_date").lt(df['date'], axis=0).sum(axis=1) 

Out[66]: 
0 0 
1 2 
2 1 
3 1 
dtype: int64 
+0

을 와우. 너무 우아한, 고마워! 이것은 df [ 'date']가 NaT 값보다 큰 것으로 계산되는 문제를 다루지 않습니다. NaT를 정말 높은 날짜로 대체하는 대안은 무엇입니까? – Luke

+0

아, 네, NaT와의 비교가 항상 거짓이라고 가정했을 것입니다. 버그 같아. 더 높은 날짜로 바꾸는 당신의 방법은 나에게 괜찮은 것 같습니다. – joris

+0

이상한 NaT 동작에 관한 문제를 제출했습니다 : https://github.com/pydata/pandas/issues/9005 – joris