Iterate int variable to do in operator check
Question:
I already referred the post here and here. Please don’t mark as duplicate. My python version is 3.8.8
I have a dataframe like as below
customer_id r f m h y
1 4 3 3 3 3
2 5 4 2 1 4
3 3 1 1 1 1
4 2 2 2 2 2
Based on the code snippet found in this repository here, am trying to do the below
a) Assign a segment_label
to each customer based on their r, f, m, h , y
values
So, I was working on the below code. But the problem is am getting an error in the 1st if-clause. I already tried replacing in
keyword with ==
symbol. But it doesn’t do the check and ends up in else clause for all records/customers
classes = []
classes_append = classes.append
cust = 'unique_key'
for row in df.iterrows():
rec = row[1]
print(rec)
r = rec['r']
f = rec['f']
y = rec['y']
p = rec['h']
if (r in (4)) and (f in (4)) and (y in (2,3)) and (h in (3)): # I replaced `in` keyword with `==` symbol as well. The code works but it doesn't check the condition. So, ends up in else clause.
classes_append({rec[cust]:'Champions'})
elif (r in (4)) and (f in (4)) and (y in (1,)) and (h in (2,3)):
classes_append({rec[cust]:'Short Tenure - Promising'})
elif (r in (3,4)) and (f in (3,4)) and (y in (3,)) and (h in (1,2,3)):
classes_append({rec[cust]:'Loyal Customers'})
elif (r in (3,4,5)) and (f in (3,4,5)) and (y in (2,)) and (h in (1,2)):
classes_append({rec[cust]:'Potential Loyalist'})
elif (r in (3,4)) and (f in (3,4)) and (y in (1,)) and (h in (1)):
classes_append({rec[cust]:'Short Tenure - Average'})
elif (r in (2,)) and (f in (1,2,3)) and (y in (1,2,3)):
classes_append({rec[cust]:'Needs Attention'})
elif (r in (4)) and (f in (1,2)) and (y in (1,2,3)):
classes_append({rec[cust]:'Occasional and New Customers'})
elif (r in (1,)) and (y in (1,2,3)):
classes_append({rec[cust]:"Lost"})
else:
print("hi")
classes.append({0:[row[1]['r'],row[1]['f'],row[1]['m']]})
accs = [list(i.keys())[0] for i in classes]
segments = [list(i.values())[0] for i in classes]
df['segment_label'] = df[cust].map(dict(zip(accs,segments)))
The error is
Answers:
I think the problem is that (4)
does not define a tuple with single item apparently hence you get TypeError: 'int' object is not iterable
. That’s why it stops at the line
if (r in (4)) and (f in (4)) and (y in (2,3)) and (h in (3)):
Maybe try replacing tuples with lists as follows (e.g. here list of one item):
>>> r = 5
>>> r in [4]
False
so your first if
statement will become
if (r in [4]) and (f in [4]) and (y in [2,3]) and (h in [3]):
Update: as The Great suggested in comments adding comma
to single item tuple solved the problem. Perhaps that should be the correct answer.
I already referred the post here and here. Please don’t mark as duplicate. My python version is 3.8.8
I have a dataframe like as below
customer_id r f m h y
1 4 3 3 3 3
2 5 4 2 1 4
3 3 1 1 1 1
4 2 2 2 2 2
Based on the code snippet found in this repository here, am trying to do the below
a) Assign a segment_label
to each customer based on their r, f, m, h , y
values
So, I was working on the below code. But the problem is am getting an error in the 1st if-clause. I already tried replacing in
keyword with ==
symbol. But it doesn’t do the check and ends up in else clause for all records/customers
classes = []
classes_append = classes.append
cust = 'unique_key'
for row in df.iterrows():
rec = row[1]
print(rec)
r = rec['r']
f = rec['f']
y = rec['y']
p = rec['h']
if (r in (4)) and (f in (4)) and (y in (2,3)) and (h in (3)): # I replaced `in` keyword with `==` symbol as well. The code works but it doesn't check the condition. So, ends up in else clause.
classes_append({rec[cust]:'Champions'})
elif (r in (4)) and (f in (4)) and (y in (1,)) and (h in (2,3)):
classes_append({rec[cust]:'Short Tenure - Promising'})
elif (r in (3,4)) and (f in (3,4)) and (y in (3,)) and (h in (1,2,3)):
classes_append({rec[cust]:'Loyal Customers'})
elif (r in (3,4,5)) and (f in (3,4,5)) and (y in (2,)) and (h in (1,2)):
classes_append({rec[cust]:'Potential Loyalist'})
elif (r in (3,4)) and (f in (3,4)) and (y in (1,)) and (h in (1)):
classes_append({rec[cust]:'Short Tenure - Average'})
elif (r in (2,)) and (f in (1,2,3)) and (y in (1,2,3)):
classes_append({rec[cust]:'Needs Attention'})
elif (r in (4)) and (f in (1,2)) and (y in (1,2,3)):
classes_append({rec[cust]:'Occasional and New Customers'})
elif (r in (1,)) and (y in (1,2,3)):
classes_append({rec[cust]:"Lost"})
else:
print("hi")
classes.append({0:[row[1]['r'],row[1]['f'],row[1]['m']]})
accs = [list(i.keys())[0] for i in classes]
segments = [list(i.values())[0] for i in classes]
df['segment_label'] = df[cust].map(dict(zip(accs,segments)))
The error is
I think the problem is that (4)
does not define a tuple with single item apparently hence you get TypeError: 'int' object is not iterable
. That’s why it stops at the line
if (r in (4)) and (f in (4)) and (y in (2,3)) and (h in (3)):
Maybe try replacing tuples with lists as follows (e.g. here list of one item):
>>> r = 5
>>> r in [4]
False
so your first if
statement will become
if (r in [4]) and (f in [4]) and (y in [2,3]) and (h in [3]):
Update: as The Great suggested in comments adding comma
to single item tuple solved the problem. Perhaps that should be the correct answer.