Handling Categorical data
ஒருவருடைய பாலினம், ரத்தவகை என்பது போன்ற மதிப்புகளைக் குறிப்பிடும் போது ஒருசில குறிப்பிட்ட மதிப்புகளையே திரும்பத் திரும்ப அளிக்க வேண்டிவரும். இதுபோன்ற சமயங்களில் string என்பதற்கு பதிலாக category எனும் தரவுவகையின் கீழ் அமைத்தால் நினைவகப் பகுதியை சற்று சேமிக்கலாம். எனவேதான் இந்த category-ஆனது hybrid வகை datatype என்று அழைக்கப்படுகிறது.
இத்தகைய categorical டேட்டாவை வைத்து எழுதப்பட்ட உதாரண நிரல் பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
d = {'Names' : pd.Series(['Mahesh','Yazhini','Kadiresan','Malathi','Kumar','Sujith']), | |
'Gender' : pd.Series(['Male','Trans','Male','Female','Male','Trans'],dtype="category")} | |
df = pd.DataFrame(d) | |
print (df['Names']) | |
print (df['Gender']) | |
print (df['Gender'].cat.remove_categories(['Trans'])) # add_categories() | |
print (df['Gender'].cat.categories) | |
c = pd.Categorical(['AB+', 'B+', 'AB+', 'O+', 'B-', 'AB-','B+']) | |
df['Blood_group'] = pd.Series(c) | |
print (df['Blood_group']) | |
c = pd.Categorical(['AB+', 'B+', 'AB+', 'O+', 'B-', 'AB-','B+'],['O+','B+']) | |
df['Blood_group'] = pd.Series(c) | |
print (df['Blood_group']) | |
print (c.ordered) | |
df['Mid Year points'] = pd.Series(["50","90","80","50","120","100"]) | |
df['Year End points'] = pd.Series(["80","50","80","90","100","50"]) | |
df['Mid Year points'] = df['Mid Year points'].astype("category", categories=["50","80","90"], ordered=True) | |
df['Year End points'] = df['Year End points'].astype("category", categories=["50","80","90"], ordered=True) | |
print (df['Mid Year points']>df['Year End points']) | |
print (df |
முதலில் 6 நபர்களின் பெயர் மற்றும் பாலினம் ஆகியவற்றை Names, Gender எனும் இரண்டு தலைப்புகளின் கீழ் சேமித்து ஒரு டேட்டாஃப்பிரேமை உருவாக்கியுள்ளோம்.
இதில் Gender எனும் தலைப்பின் கீழ் அமையும் தரவுகளின் வகையை dtypes=category என வரையறுத்துள்ளோம்.
d = {‘Names’ : pd.Series([‘Mahesh’,’Yazhini’,’Kadiresan’,’Malathi’,’Kumar’,’Sujith’]),
‘Gender’ : pd.Series([‘Male’,’Trans’,’Male’,’Female’,’Male’,’Trans’],dtype=”category”)}
df = pd.DataFrame(d)
ஆகவேதான் Names-ஐப் பிரிண்ட் செய்து பார்க்கும்போது அதனுடைய dtype மதிப்பு object என வெளிப்படுவதையும், Gender-ஐப் பிரிண்ட் செய்யும் போது அதனுடைய மதிப்பு category என வெளிப்படுவதையும் காணலாம்.
print (df[‘Names’])
0 Mahesh
1 Yazhini
2 Kadiresan
3 Malathi
4 Kumar
5 Sujith
Name: Names, dtype: object
மேலும் பல முறை திரும்பத் திரும்ப வந்துள்ள மதிப்புகளை ஒருமுறை மட்டும் எடுத்துக் காட்டி மொத்தம் இத்தனை மதிப்புகளே இதில் இடம் பெற்றுள்ளன என்பதையும் வெளிப்படுத்தும்.
இங்கு Male, Female, Trans ஆகிய மூன்று மதிப்புகளே திரும்பத் திரும்ப வந்துள்ளன என்பதை வெளிப்படுத்தியுள்ளது.
print (df[‘Gender’])
0 Male
1 Trans
2 Male
3 Female
4 Male
5 Trans
Name: Gender, dtype: category
Categories (3, object): [Female, Male, Trans]
மொத்தமுள்ள 3 மதிப்புகளில் ஏதேனும் ஒரு மதிப்பினை கேட்டகிரியில் இருந்து நீக்க விரும்பினால் அது பின்வருமாறு அமையும். இங்கு Trans எனும் மதிப்பு நீக்கப்பட்டுள்ளது. ஆகவே இந்த மதிப்பு அமைந்துள்ள இடங்களில் NaN என்பதை வெளிப்படுத்தும்.
print (df[‘Gender’].cat.remove_categories([‘Trans’])) # add_categories()
0 Male
1 NaN
2 Male
3 Female
4 Male
5 NaN
Name: Gender, dtype: category
Categories (2, object): [Female, Male]
ஒரு கேட்டகிரியில் மொத்தம் என்னென்ன மதிப்புகள் உள்ளன என்பதைக் காண்பதற்கான கட்டளை பின்வருமாறு.
print (df[‘Gender’].cat.categories)
Index([‘Female’, ‘Male’, ‘Trans’], dtype=’object’)
ஒரு series-க்குள் மதிப்புகளைக் கொடுத்து அதன் dtype=category என வரையறுப்பதன் மூலம் எவ்வாறு categorical டேட்டாவை உருவாக்கலாம் என்று பார்த்தோம். இவ்வாறு அல்லாமல் நேரடியாக pd.categorical என்பதற்குள் மதிப்புகளைக் கொடுத்து அதனை series-க்குள் செலுத்துவதன் மூலமும் இத்தகைய டேட்டாவை உருவாக்கலாம்.
இங்கு Blood_group எனும் டேட்டா இம்முறையில் உருவாக்கப்பட்டுள்ளது.
c = pd.Categorical([‘AB+’, ‘B+’, ‘AB+’, ‘O+’, ‘B-‘, ‘AB-‘,’B+’])
df[‘Blood_group’] = pd.Series(c)
print (df[‘Blood_group’])
0 AB+
1 B+
2 AB+
3 O+
4 B-
5 AB-
Name: Blood_group, dtype: category
Categories (5, object): [AB+, AB-, B+, B-, O+]
பொதுவாக pd.Categorical என்பதற்குள் கொடுக்கப்பட்ட லிஸ்டில் உள்ள unique மதிப்புகளை எடுத்து கேட்டகிரியில் உள்ள மதிப்புகள் அமையும். இவ்வாறு அல்லாமல் ஒரு குறிப்பிட்ட மதிப்புகளை மட்டும் கொடுத்து அதனை கேட்டகிரியின் மதிப்பாக அமைக்க விரும்பினால் அது பின்வருமாறு.
இங்கு pd.Categorical என்பதற்குள் உள்ள முதல் லிஸ்டில் பல்வேறு மதிப்புகள் கொடுக்கப்பட்டாலும், அதனைத் தொடர்ந்து உள்ள அடுத்த லிஸ்டில் [‘O+’,’B+’] மதிப்புகளை மட்டும் கேட்டகிரியின் மதிப்பாக அமைக்குமாறு கொடுத்துள்ளோம்.
எனவேதான் இம்மதிப்புகள் தவிர மற்ற மதிப்புகளுக்கு NaN வெளிப்படுத்தியுள்ளதைக் காணலாம்.
c = pd.Categorical([‘AB+’, ‘B+’, ‘AB+’, ‘O+’, ‘B-‘, ‘AB-‘,’B+’],[‘O+’,’B+’])
df[‘Blood_group’] = pd.Series(c)
print (df[‘Blood_group’])
0 NaN
1 B+
2 NaN
3 O+
4 NaN
5 NaN
Name: Blood_group, dtype: category
Categories (2, object): [O+, B+]
Ordered எனும் பண்பினைப் பயன்படுத்தி கேட்டகிரி உருவாக்கப்பட்டுள்ளதா இல்லையா என்பதைக் கண்டுபிடிக்க பின்வருமாறு கொடுக்கலாம்.
print (c.ordered)
False
இப்பண்பினைப் பயன்படுத்தி அடுத்து இரு series-ஐ உருவாக்கி பார்க்கலாம்.
ஒரு series-ஐ உருவாக்கும்போது dtype=category எனக் கொடுக்கலாம் அல்லது pd.Categorical எனக் கொடுத்து கேட்டகிரியை உருவாக்கிய பின்னர் series-ஐ உருவாக்கலாம். இவ்விரண்டு முறையிலும் அல்லாமல் astype எனக் கொடுத்து ஒரு series-ஐ உருவாக்கிய பின்னரும் கேட்டகிரியாக மாற்றலாம்.
இங்கு ஒருவர் ஆண்டின் இடையில் எவ்வளவு மதிப்புகள் பெற்றுள்ளார் மற்றும் ஆண்டின் இறுதியில் எவ்வளவு மதிப்புகள் பெற்றுள்ளார் என்பதை வைத்து இரண்டு சீரீஸ் உருவாக்கப்பட்டுள்ளது.
df[‘Mid Year points’] = pd.Series([“50″,”90″,”80″,”50″,”120″,”100”])
df[‘Year End points’] = pd.Series([“80″,”50″,”80″,”90″,”100″,”50”])
பின்னர் astype மூலம் கேட்டகிரி உருவாக்கப்பட்டு அதன் மதிப்புகளாக [“50″,”80″,”90”] ஆகியவற்றை மட்டும் எடுத்துக் கொள்ளுமாறு கூறப்பட்டுள்ளது. இதனை உருவாக்கும் போது ordered=True எனக் கொடுத்து உருவாக்கியுள்ளோம். இதன் மூலம் இவ்விரண்டு series-ஐயும் ஒப்பிடும் வாய்ப்பு நமக்குக் கிடைக்கிறது.
df[‘Mid Year points’] = df[‘Mid Year points’].astype(“category”, categories=[“50″,”80″,”90”], ordered=True)
df[‘Year End points’] = df[‘Year End points’].astype(“category”, categories=[“50″,”80″,”90”], ordered=True)
இங்கு ஒருவர் ஆண்டின் இடையில் பெற்ற மதிப்புகளைவிட ஆண்டின் இறுதியில் அதிக மதிப்பெண்கள் பெற்றுள்ளாரா இல்லையா என்பது கண்டுபிடிக்கப்பட்டுள்ளது.
print (df[‘Mid Year points’]>df[‘Year End points’])
0 False
1 True
2 False
3 False
4 False
5 False
Name: Year End points, dtype: bool