2017-12-26 2 views
1

전자 메일 데이터와 같은 일부 광고 데이터로 작업하고 있습니다. 각 사람을 위해, 그들은 전환되었다 어떤 일 다음 일 그들이 우편으로 발송 된 것을 언급하고 있음을, 메일 수준에서for 루프없이 효율적으로 데이터 프레임 생성

  1. 하나 : 나는 두 개의 데이터 세트가 있습니다.

    import pandas as pd 
    
    df_emailed=pd.DataFrame() 
    df_emailed['person']=['A','A','A','A','B','B','B'] 
    df_emailed['day']=[2,4,8,9,1,2,5] 
    df_emailed 
    print(df_emailed) 
    
        person day 
    0  A 2 
    1  A 4 
    2  A 8 
    3  A 9 
    4  B 1 
    5  B 2 
    6  B 5 
    
  2. 나는 요약 사람이 변환 여부를 말한다 dataframe, 그리고 그들이 변환 일이있다.

    df_summary=pd.DataFrame() 
    df_summary['person']=['A','B'] 
    df_summary['days_max']=[10,5] 
    df_summary['convert']=[1,0] 
    print(df_summary) 
    
        person days_max convert 
    0  A  10  1 
    1  B   5  0 
    

나는 각 사람을 말한다 최종 dataframe에 이들을 결합하고 싶습니다 : 최대 날짜

  • 1, 그들은 이메일로 전송되었는지
  • (0,1) 데이터 프레임의 마지막 날에
  • 변환 여부 (0,1).

데이터 프레임의 마지막 날에 변환한다고 가정합니다.

중첩 된 for 루프를 사용하여이 작업을 수행 할 것을 알고 있습니다. 그러나 나는 이것이 매우 비효율적이며 일종의 바보 같다고 생각합니다. 누구든지이 일을 처리하는 효율적인 방법을 알고 있습니까?

는 결과

df_final=pd.DataFrame() 
df_final['person']=['A','A','A','A','A','A','A','A','A','A','B','B','B','B','B'] 
df_final['day']=[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5] 
df_final['emailed']=[0,1,0,1,0,0,0,1,1,0,1,1,0,0,1] 
df_final['convert']=[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0] 
print(df_final) 

    person day emailed convert 
0  A 1  0  0 
1  A 2  1  0 
2  A 3  0  0 
3  A 4  1  0 
4  A 5  0  0 
5  A 6  0  0 
6  A 7  0  0 
7  A 8  1  0 
8  A 9  1  0 
9  A 10  0  1 
10  B 1  1  0 
11  B 2  1  0 
12  B 3  0  0 
13  B 4  0  0 
14  B 5  1  0 

을 원하는 당신과 행복한 휴일 감사합니다!

+0

큰 캐치 당신을 어디 감사합니다. –

답변

1

높은 수준의 접근 방식에는 df_summary (별칭 df2)을 수정하여 Google 출력물을 얻습니다. 우리는 df2days_max

  • set_index 작업을해야합니다. 우리는 또한 인덱스에 person
  • applyreindex 작업에 그룹에
  • groupby을 (나중에 도움이됩니다) days로 이름을 변경합니다 (일, 그래서 우리는 마지막 날 개까지 선두 매일 행을 얻을)
  • fillna
  • 는 나중에 설정하는 것이다 emailed 더미 열을 생성하는 색인화
  • assign의 결과로서 발생하는 열에 convert NaN을 충전한다.

다음으로 이전 조작의 결과에 df_emailed을 사용하여 색인하십시오. 이 값을 사용하여 해당 emailed 셀을 1으로 설정합니다. 이 작업은인 MultiIndexing을 통해 수행됩니다.

마지막으로 인덱스를 열로 가져 오려면 reset_index을 사용하십시오.

def f(x): 
    return x.reindex(np.arange(1, x.index.max() + 1)) 

df = df2.set_index('days_max')\ 
     .rename_axis('day')\ 
     .groupby('person')['convert']\ 
     .apply(f)\ 
     .fillna(0)\ 
     .astype(int)\ 
     .to_frame()\ 
     .assign(emailed=0) 

df.loc[df1[['person', 'day']].apply(tuple, 1).values, 'emailed'] = 1 
df.reset_index() 

    person day convert emailed 
0  A 1  0  0 
1  A 2  0  1 
2  A 3  0  0 
3  A 4  0  1 
4  A 5  0  0 
5  A 6  0  0 
6  A 7  0  0 
7  A 8  0  1 
8  A 9  0  1 
9  A 10  1  0 
10  B 1  0  1 
11  B 2  0  1 
12  B 3  0  0 
13  B 4  0  0 
14  B 5  0  1 

df1 = df_emailed 

하고,

df2 = df_summary 
+0

나는 현명하지 않다. 나는별로 좋아하지 않는다. 나는별로 중요하지 않다. –

+0

@ TrexionKameha 나는 대답을 당신에게 유용하게 생각합니다. 즐거운 휴일 :-) –

+0

예! 고맙습니다. 키에 다른 열 (예 : 캠페인)을 추가하려면 어떻게해야합니까? 사람 A의 인터넷 익스플로러, 사람 B의 캡틴 X, Y, Z가 있었고 각 단계에서 변환을 원합니다. 간단합니까? 나는 나 자신을 시험해보고 중복 키로 문제가 발생했다. –

관련 문제