2015-11-29 4 views
1

Учитывая следующий кадр данных:в процентах от группы

DF = pd.DataFrame({'Site': ['A', 'A', 'A', 'A', 'B', 'B','B','B'], 
        'Score': [1, -1, -0.5, 1, 0, -1, 2, 4], 
        'Group': [1, 1, 2, 2, 1, 1, 2, 2]}) 
DF 
    Group Score Site 
0 1  1.0 A 
1 1  -1.0 A 
2 2  -0.5 A 
3 2  1.0 A 
4 1  0.0 B 
5 1  -1.0 B 
6 2  2.0 B 
7 2  4.0 B 

Я хотел бы иметь панда добавить столбец, который показывает процент строк на сайт, которые имеют балл на уровне или выше 0 (т.е. 3 из 4 строки на сайте B находятся на уровне или выше нуля, поэтому результат равен 75%) и другой столбец, который показывает процент по группам внутри каждого сайта (т.е. группа 1 на сайте A имеет 1 балл из 2, который находится на уровне или выше нуля, поэтому результат составляет 50%). Желаемый результат выглядит следующим образом:

Group Score Site Site% SiteGroup% 
0  1 1.0  A 0.5  0.5 
1  1 -1.0  A 0.5  0.5 
2  2 -0.5  A 0.5  0.5 
3  2 1.0  A 0.5  0.5 
4  1 0.0  B 0.75 0.5 
5  1 -1.0  B 0.75 0.5 
6  2 2.0  B 0.75 1 
7  2 4.0  B 0.75 1 

Заранее благодарен!

ответ

1

Вы можете попробовать:

df['score_indicator'] = df.Score.apply(lambda x: 1 if x >=0 else 0) 
df['Site%'] = df.groupby('Site')['score_indicator'].transform(lambda x: x.sum()/x.count()) 
df['Group%'] = df.groupby(['Site','Group'])['score_indicator'].transform(lambda x: x.sum()/x.count()) 

получить

print(df) 
    Group Score Site score_indicator Site% Group% 
0  1 1.0 A    1 0.50 0.50 
1  1 -1.0 A    0 0.50 0.50 
2  2 -0.5 A    0 0.50 0.75 
3  2 1.0 A    1 0.50 0.75 
4  1 0.0 B    1 0.75 0.50 
5  1 -1.0 B    0 0.75 0.50 
6  2 2.0 B    1 0.75 0.75 
7  2 4.0 B    1 0.75 0.75 
Смежные вопросы