Python - Pandas Процентное распределение менее 80% - PullRequest
1 голос
/ 22 апреля 2020

У меня есть следующий фрейм данных, как я могу создать новый столбец с городами, которые представляют 80% всех значений? В данном случае это «a», «b» и «c». Остальные города должны иметь метку «прочее».

values = ['a','a','a','a','a','a','a','a','b','b','b','b','b','b','c','c','c','c','c','d','d','d','e','e','f']
db = pd.DataFrame(values,columns = ['city'])

db['city'].value_counts(normalize=True)

a    0.32
b    0.24
c    0.20
d    0.12
e    0.08
f    0.04

Желаемый результат

db['city_freq'] = ['a','a','a','a','a','a','a','a','b','b','b','b','b','b','c','c','c','c','c','other','other','other','other','other','other']

1 Ответ

0 голосов
/ 22 апреля 2020

Отфильтруйте все значения с накопленной суммой по Series.cumsum с условием, получите index значений и сравните оригинал по Series.isin с DataFrame.loc для заменяемых значений:

s = db['city'].value_counts(normalize=True).cumsum()

print (s)
a    0.32
b    0.56
c    0.76
d    0.88
e    0.96
f    1.00

print (s.index[s > 0.8])
Index(['d', 'e', 'f'], dtype='object')

db.loc[db['city'].isin(s.index[s > 0.8]), 'city'] = 'other'
print (db)
     city
0       a
1       a
2       a
3       a
4       a
5       a
6       a
7       a
8       b
9       b
10      b
11      b
12      b
13      b
14      c
15      c
16      c
17      c
18      c
19  other
20  other
21  other
22  other
23  other
24  other

Другое решение с Series.map совокупными суммами, а затем сравнение по порогу:

s = db['city'].value_counts(normalize=True).cumsum()

db.loc[db['city'].map(s) > 0.8, 'city'] = 'other'

Подробности :

print (db['city'].map(s))
0     0.32
1     0.32
2     0.32
3     0.32
4     0.32
5     0.32
6     0.32
7     0.32
8     0.56
9     0.56
10    0.56
11    0.56
12    0.56
13    0.56
14    0.76
15    0.76
16    0.76
17    0.76
18    0.76
19    0.88
20    0.88
21    0.88
22    0.96
23    0.96
24    1.00
Name: city, dtype: float64
...