Get Row in Other Table

Viewed 35

I have a dataframe 'df'. Using the validation data validData, I want to compute the response rate (Florence = 1/Yes) using the rfm_aboveavg (RFM combinations response rates above the overall response). Response rate is given by considering 0/No and 1/Yes, so it would be rfm_crosstab[1] / rfm_crosstab['All'].

Using the results from the validation data, I want to only display the rows that are also shown in the training data output by the RFM column. How do I do this?

Data: 'df'

Seq#    ID# Gender  M   R   F   FirstPurch  ChildBks    YouthBks    CookBks ... ItalCook    ItalAtlas   ItalArt Florence    Related Purchase    Mcode   Rcode   Fcode   Yes_Florence    No_Florence
0   1   25  1   297 14  2   22  0   1   1   ... 0   0   0   0   0   5   4   2   0   1
1   2   29  0   128 8   2   10  0   0   0   ... 0   0   0   0   0   4   3   2   0   1
2   3   46  1   138 22  7   56  2   1   2   ... 1   0   0   0   2   4   4   3   0   1
3   4   47  1   228 2   1   2   0   0   0   ... 0   0   0   0   0   5   1   1   0   1
4   5   51  1   257 10  1   10  0   0   0   ... 0   0   0   0   0   5   3   1   0   1

My code: Crosstab for training data trainData

trainData, validData = train_test_split(df, test_size=0.4, random_state=1)

# Response rate for training data as a whole
responseRate = (sum(trainData.Florence == 1) / sum(trainData.Florence == 0)) * 100

# Response rate for RFM categories
# RFM: Combine R, F, M categories into one category
trainData['RFM'] = trainData['Mcode'].astype(str) + trainData['Rcode'].astype(str) + trainData['Fcode'].astype(str)

rfm_crosstab = pd.crosstab(index = [trainData['RFM']], columns = trainData['Florence'], margins = True)
rfm_crosstab['Percentage of 1/Yes'] = 100 * (rfm_crosstab[1] / rfm_crosstab['All'])

# RFM combinations response rates above the overall response
rfm_aboveavg = rfm_crosstab['Percentage of 1/Yes'] > responseRate
rfm_crosstab[rfm_aboveavg]

Output: Training data

Florence    0   1   All Percentage of 1/Yes
RFM             
121 3   2   5   40.000000
131 9   1   10  10.000000
212 1   2   3   66.666667
221 6   3   9   33.333333
222 6   1   7   14.285714
313 2   1   3   33.333333
321 17  3   20  15.000000
322 20  4   24  16.666667
323 2   1   3   33.333333
341 61  10  71  14.084507
343 17  2   19  10.526316
411 12  3   15  20.000000
422 26  5   31  16.129032
423 32  8   40  20.000000
441 96  12  108 11.111111
511 19  4   23  17.391304
513 44  8   52  15.384615
521 24  5   29  17.241379
523 74  16  90  17.777778
533 177 28  205 13.658537

My code: Crosstab for validation data validData

# Response rate for RFM categories
# RFM: Combine R, F, M categories into one category
validData['RFM'] = validData['Mcode'].astype(str) + validData['Rcode'].astype(str) + validData['Fcode'].astype(str)

rfm_crosstab1 = pd.crosstab(index = [validData['RFM']], columns = validData['Florence'], margins = True)
rfm_crosstab1['Percentage of 1/Yes'] = 100 * (rfm_crosstab1[1] / rfm_crosstab1['All'])

rfm_crosstab1

Output: Validation data

Florence    0   1   All Percentage of 1/Yes
RFM             
131 3   1   4   25.000000
141 8   0   8   0.000000
211 2   1   3   33.333333
212 2   0   2   0.000000
213 0   1   1   100.000000
221 5   0   5   0.000000
222 2   0   2   0.000000
231 21  1   22  4.545455
232 3   0   3   0.000000
233 1   0   1   0.000000
241 11  1   12  8.333333
242 8   0   8   0.000000
243 2   0   2   0.000000
311 7   0   7   0.000000
312 8   0   8   0.000000
313 1   0   1   0.000000
321 12  0   12  0.000000
322 13  0   13  0.000000
323 4   1   5   20.000000
331 19  1   20  5.000000
332 25  2   27  7.407407
333 11  1   12  8.333333
341 36  2   38  5.263158
342 30  2   32  6.250000
343 12  0   12  0.000000
411 8   2   10  20.000000
412 7   0   7   0.000000
413 13  1   14  7.142857
421 21  2   23  8.695652
422 30  1   31  3.225806
423 26  1   27  3.703704
431 51  3   54  5.555556
432 42  7   49  14.285714
433 41  5   46  10.869565
441 68  2   70  2.857143
442 78  3   81  3.703704
443 70  5   75  6.666667
511 17  0   17  0.000000
512 13  1   14  7.142857
513 26  6   32  18.750000
521 19  1   20  5.000000
522 25  6   31  19.354839
523 50  6   56  10.714286
531 66  3   69  4.347826
532 65  3   68  4.411765
533 128 24  152 15.789474
541 86  7   93  7.526882
542 100 6   106 5.660377
543 178 17  195 8.717949
All 1474    126 1600    7.875000
0 Answers
Related