반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- string
- Excel
- PANDAS
- google apps script
- matplotlib
- Mac
- Github
- PySpark
- 파이썬
- c#
- list
- Kotlin
- gas
- GIT
- Redshift
- Apache
- Java
- array
- Python
- Google Excel
- django
- Google Spreadsheet
- numpy
- hive
- PostgreSQL
- dataframe
- math
- SQL
- Tkinter
Archives
- Today
- Total
달나라 노트
Python Pandas : Percentile Rank 계산하기 (백분위 계산하기) 본문
Python/Python Pandas
Python Pandas : Percentile Rank 계산하기 (백분위 계산하기)
CosmosProject 2024. 3. 25. 23:20728x90
반응형
pandas DataFrame에서 어떻게 Percentile Rank를 계산하는지 봅시다.
(백분위, 백분위수에 대한 이해를 기반으로 합니다. 백분위 관련 개념 습득을 위해서는 아래 글을 참고하면 좋습니다.)
https://cosmosproject.tistory.com/826
import pandas as pd
dict_test = {
'col1': [
10,
20,
30,
40,
50,
60,
70,
80,
90,
100,
110
]
}
df = pd.DataFrame(dict_test)
df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
method='min',
pct=False,
na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)
-- Result
col1 rank value_count percentile_rank
0 10 1.0 11 0.0
1 20 2.0 11 0.1
2 30 3.0 11 0.2
3 40 4.0 11 0.3
4 50 5.0 11 0.4
5 60 6.0 11 0.5
6 70 7.0 11 0.6
7 80 8.0 11 0.7
8 90 9.0 11 0.8
9 100 10.0 11 0.9
10 110 11.0 11 1.0
백분위(Percentile Rank)를 직접적으로 한 번에 구해주는 것은 없습니다.
따라서 위처럼 값들의 Rank를 구하고 값들의 개수를 구하여 이를 기반으로 백분위를 구해야 합니다.
import pandas as pd
import numpy as np
dict_test = {
'col1': [
10,
20,
30,
40,
50,
60,
70,
80,
90,
100,
110
]
}
df = pd.DataFrame(dict_test)
df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
method='min',
pct=False,
na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)
print(np.percentile(
a=list(df.loc[:, 'col1']),
q=10
))
-- Result
col1 rank value_count percentile_rank
0 10 1.0 11 0.0
1 20 2.0 11 0.1
2 30 3.0 11 0.2
3 40 4.0 11 0.3
4 50 5.0 11 0.4
5 60 6.0 11 0.5
6 70 7.0 11 0.6
7 80 8.0 11 0.7
8 90 9.0 11 0.8
9 100 10.0 11 0.9
10 110 11.0 11 1.0
20.0
계산된 백분위를 검증하기 위해 numpy의 percentile method를 사용하여 백분위 10% 위치에 있는 백분위수가 무엇인지 구해보았습니다.
20이 결과로 출력되는데
DataFrame에서 백분위 0.1(= 10%)인 값을 보면 20인 것을 알 수 있습니다.
잘 구해진 것을 알 수 있죠.
import pandas as pd
import numpy as np
dict_test = {
'col1': [
-30,
-20,
-10,
40,
50,
60,
]
}
df = pd.DataFrame(dict_test)
df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
method='min',
pct=False,
na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)
print(np.percentile(
a=list(df.loc[:, 'col1']),
q=10
))
-- Result
col1 rank value_count percentile_rank
0 -30 1.0 6 0.0
1 -20 2.0 6 0.2
2 -10 3.0 6 0.4
3 40 4.0 6 0.6
4 50 5.0 6 0.8
5 60 6.0 6 1.0
-25.0
위처럼 값에 음수가 있어도 상관 없습니다.
import pandas as pd
import numpy as np
dict_test = {
'col1': [
-30,
-30,
-10,
40,
50,
60,
]
}
df = pd.DataFrame(dict_test)
df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
method='min',
pct=False,
na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)
print(np.percentile(
a=list(df.loc[:, 'col1']),
q=10
))
-- Result
col1 rank value_count percentile_rank
0 -30 1.0 6 0.0
1 -20 2.0 6 0.2
2 -20 2.0 6 0.2
3 40 4.0 6 0.6
4 50 5.0 6 0.8
5 60 6.0 6 1.0
-25.0
또한 동일한 값이 존재해도 상관 없이 백분위를 구할 수 있습니다.
728x90
반응형
'Python > Python Pandas' 카테고리의 다른 글
Comments