2016-10-23 3 views
0

일일 수준에는 하나의 값 열이 있고 주 단위로 값 열이 있습니다. 나는 대응하는 회사와 그룹을 위해 일일 값을 일주일 단위의 주간 값으로 나누고 싶다. 나는 루프없이 할 수있는 방법을 찾아 내려고 노력하고 있는데 팬더 나 멍청이로 이것을 할 수있는 방법이있는 것처럼 느껴진다. 그러나 나는 그것을 이해할 수 없다. 도와 주셔서 감사합니다! 예를 들어팬더 데이터 프레임은 날짜를 기준으로 행을 나눕니다.

, I는 두 개의 데이터 프레임을 가지고

DF1 =

Company Group Date  People 
A  X  01/07/2015 5 
A  X  01/14/2015 10 
A  XX 01/07/2015 6 
A  XX 01/14/2015 12 
B  Y  01/07/2015 4 
B  Y  01/14/2015 8 
B  YY 01/07/2015 5 
B  YY 01/14/2015 4 

DF2 =

Company Group Date  Value 
A  X  01/04/2015 5 
A  X  01/06/2015 10 
A  X  01/13/2015 15 
A  XX 01/05/2015 6 
A  XX 01/06/2015 9 
A  XX 01/11/2015 9 
A  XX 01/14/2015 12 
B  Y  01/05/2015 4 
B  Y  01/07/2015 6 
B  Y  01/13/2015 16 
B  Y  01/14/2015 24 
B  YY 01/03/2015 10 
B  YY 01/11/2015 10 
B  YY 01/14/2015 12 

내가되도록 결과 싶습니다

Company Group Date  Value/People 
A  X  01/04/2015 1 
A  X  01/06/2015 2 
A  X  01/13/2015 1.5 
A  XX 01/05/2015 1 
A  XX 01/06/2015 1.5 
A  XX 01/11/2015 0.75 
A  XX 01/14/2015 1 
B  Y  01/05/2015 1 
B  Y  01/07/2015 1.5 
B  Y  01/13/2015 2 
B  Y  01/14/2015 3 
B  YY 01/03/2015 2 
B  YY 01/11/2015 2.5 
B  YY 01/14/2015 3 
+0

날짜가 고유하지 않은, 그래서 당신은 일주일 동안 값으로 나눌 때하는 일 폭포 ...하는 값 당신이 선택합니까? 이 데이터만으로는 충분하지 않습니다. 시도한 루프를 보여주십시오. – piRSquared

+0

해당 회사 및 그룹을 기준으로 가치를 선택하고 싶습니다. 예를 들어 df2 (회사 A 및 그룹 X)의 첫 번째 행에 대해 회사 A, 그룹 X에 해당하는 df1의 행으로 값을 나누고 싶습니다. 여기서 df2 (01/04/2015)의 날짜는 df1 (01/07/2015)의 주에 이 점을 분명히하기 위해 제 질문을 수정했습니다. – user3357979

답변

1

날짜와 같은 기본 dtype DataFrames 및 시리즈에 저장된 값은 NumPy datetime64[ns]입니다. datetime64[ns] 값의 배열이 정식 초에 "잘립니다"할 수있다, 분, 시간, 일, 주, 월 또는 연도 (해당 장치에 의해 대체된다 ?astype('datetime64[?]')을 호출하여 예 : s, m, h, D, W, M, Y).

여기에 우리의 문제는 각 날짜를 정식 주간으로 분류 할 수 있다면 크게 해결 될 것입니다. 우리는 .astype('datetime64[W]')를 사용하여이 작업을 수행 할 수 있습니다

In [152]: df1['Week'] = df1['Date'].values.astype('datetime64[W]'); df1 
Out[152]: 
    Company  Date Group People  Week 
0  A 2015-01-07  X  5 2015-01-01 
1  A 2015-01-14  X  10 2015-01-08 
2  A 2015-01-07 XX  6 2015-01-01 
3  A 2015-01-14 XX  12 2015-01-08 
4  B 2015-01-07  Y  4 2015-01-01 
5  B 2015-01-14  Y  8 2015-01-08 
6  B 2015-01-07 YY  5 2015-01-01 
7  B 2015-01-14 YY  4 2015-01-08 

df1df2 모두이 일을하는 데, 우리는 지금 ['Week', 'Group', 'Company']에 DataFrames을 병합 할 수 있습니다. 이것은 df1과 df2의 해당 행과 일치합니다. 따라서 Value to People의 비율을 찾는 것이 쉽습니다.


import pandas as pd 
df1 = pd.DataFrame({'Company': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Date': ['01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015', '01/07/2015', '01/14/2015'], 'Group': ['X', 'X', 'XX', 'XX', 'Y', 'Y', 'YY', 'YY'], 'People': [5, 10, 6, 12, 4, 8, 5, 4]}) 

df2 = pd.DataFrame({'Company': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], 'Date': ['01/04/2015', '01/06/2015', '01/13/2015', '01/05/2015', '01/06/2015', '01/11/2015', '01/14/2015', '01/05/2015', '01/07/2015', '01/13/2015', '01/14/2015', '01/03/2015', '01/11/2015', '01/14/2015'], 'Group': ['X', 'X', 'X', 'XX', 'XX', 'XX', 'XX', 'Y', 'Y', 'Y', 'Y', 'YY', 'YY', 'YY'], 'Value': [5, 10, 15, 6, 9, 9, 12, 4, 6, 16, 24, 10, 10, 12]}) 

for df in [df1, df2]: 
    df['Date'] = pd.to_datetime(df['Date']) 
    df['Week'] = df['Date'].values.astype('datetime64[W]') 

result = pd.merge(df2, df1, how='left', on=['Week', 'Group', 'Company'], suffixes=['', '_1']) 
result['Value/People'] = result['Value']/result['People'] 
result = result[['Company', 'Group', 'Date', 'Value/People']] 
print(result) 

수익률

정규 주에 날짜를자를 때 고려 될 필요가있다 "기본 오프셋"문제가 있음을
Company Group  Date Value/People 
0  A  X 2015-01-04   1.00 
1  A  X 2015-01-06   2.00 
2  A  X 2015-01-13   1.50 
3  A XX 2015-01-05   1.00 
4  A XX 2015-01-06   1.50 
5  A XX 2015-01-11   0.75 
6  A XX 2015-01-14   1.00 
7  B  Y 2015-01-05   1.00 
8  B  Y 2015-01-07   1.50 
9  B  Y 2015-01-13   2.00 
10  B  Y 2015-01-14   3.00 
11  B YY 2015-01-03   2.00 
12  B YY 2015-01-11   2.50 
13  B YY 2015-01-14   3.00 

참고. 즉, 일주일에 언제 시작해야하는지 결정해야합니다. 정규 선택이 df['Date'].values.astype('datetime64[W]') 인 것으로 마음에 들지 않으면 날짜에 오프셋을 추가해야 할 수 있습니다. 예를 들어, 당신이 사용할 수 df['Date']에 날짜에 하루를 추가합니다 :

(df['Date'].values + np.timedelta64(1, 'D')).astype('datetime64[W]') 
관련 문제