Solution
The following solution uses a list-comprehension + dict to produce what you need. However, if you have many values, you may also want to check that each value is getting correctly classified. For that purpose, I would suggest you to use a dict
instead.
Code: Example
# define rules as a dict
rules = {
'A': [0, 9],
'B': [10, 19],
'C': [20, 49],
'D': [50, 100],
}
# use a list comprehension: one-line solution
[k for k, v in rules.items() if (min(v) <= x <= max(v))]
Code: output a list of dicts
This is a quick sanity-check.
values = [0, 8, 9, 12, 15, 19, 20, 30, 45, 49, 50, 60, 80, 100]
[dict((x, k) for k, v in rules.items() if (min(v) <= x <= max(v))) for x in values]
Output:
[{0: 'A'},
{8: 'A'},
{9: 'A'},
{12: 'B'},
{15: 'B'},
{19: 'B'},
{20: 'C'},
{30: 'C'},
{45: 'C'},
{49: 'C'},
{50: 'D'},
{60: 'D'},
{80: 'D'},
{100: 'D'}]
An alternative: using pandas
library
# Dummy data
values = [0, 8, 9, 12, 15, 19, 20, 30, 45, 49, 50, 60, 80, 100]
df = pd.DataFrame({'data': values})
# Method-1: "df.assign" + "pd.cut"
df.assign(Rule = pd.cut(df.data, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True))
# Method-2: just "pd.cut"
df['Rule'] = pd.cut(df.data, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True)
# Method-3:
pd.cut(values, bins = [0, 10, 20, 50, 100], labels = list('ABCD'), include_lowest=True)