2016-04-19 1 views
1

Я хочу упорядочить данные из фрейма данных в несколько блоков данных или групп. Входные данныеНарезка и компоновка данных в пандах

id channel path 
15 direct a1 
15 direct a2 
15 direct a3 
15 direct a4 
213 paid b2 
213 paid b1 
2222 direct as25 
2222 direct dw46 
2222 direct 32q 
3111 paid d32a 
3111 paid 23ff 
3111 paid www32 
3111 paid 2d2 

желаемый результат должен быть как

id channel p1 p2  
213 paid b2 b2  

id channel p1 p2 p3 
2222 direct as25 dw46 dw46  

id channel p1 p2 p3 p4 
15 direct a1 a2 a3 a4 
3111 paid d32a 23ff www32 2d2 

Пожалуйста, скажите, как я могу добиться этого. Спасибо

+0

Использование блоков кода вместо изображений, которые делают его легким для других, чтобы воспроизвести ваш пример. – Zero

+0

обязательно, сделаю. –

ответ

1

Я думаю, вы можете сначала создать вспомогательную колонку cols по cumcount, а затем pivot_table. . Затем вам нужно найти длину notnull колонок (первая часть 2) и groupby этим length. Последние dropna столбцов в каждой группе:

df['cols'] = 'p' + (df.groupby('id')['id'].cumcount() + 1).astype(str) 

df1 = df.pivot_table(index=['id', 'channel'], 
        columns='cols', 
        values='path', 
        aggfunc='first').reset_index().rename_axis(None, axis=1) 

print df1 
    id channel p1 p2  p3 p4 
0 15 direct a1 a2  a3 a4 
1 213 paid b2 b1 None None 
2 2222 direct as25 dw46 32q None 
3 3111 paid d32a 23ff www32 2d2 

print df1.apply(lambda x: x.notnull().sum() - 2 , axis=1) 
0 4 
1 2 
2 3 
3 4 
dtype: int64 

for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1)): 
    print i 
    print g.dropna(axis=1) 
2 
    id channel p1 p2 
1 213 paid b2 b1 
3 
    id channel p1 p2 p3 
2 2222 direct as25 dw46 32q 
4 
    id channel p1 p2  p3 p4 
0 15 direct a1 a2  a3 a4 
3 3111 paid d32a 23ff www32 2d2 

Для хранения можно использовать dictionary из DataFrames:

dfs={i: g.dropna(axis=1)   
    for i, g in df1.groupby(df1.apply(lambda x: x.notnull().sum() - 2 , axis=1))} 

#select DataFrame with len=2  
print dfs[2] 
    id channel p1 p2 
1 213 paid b2 b1 

#select DataFrame with len=3  
print dfs[3] 
    id channel p1 p2 p3 
2 2222 direct as25 dw46 32q 
+0

Я получаю сообщение об ошибке # renamer function if pass a dict [TypeError: должен передать индекс для переименования] –

+0

Я думаю, вам нужно использовать 'pandas' версию' 0.18.0'. Но если ваша версия ниже, опустите '.rename_axis (None, axis = 1)' – jezrael

+0

Я очень благодарен за вашу помощь. –

Смежные вопросы