Why does storing the output of .count() result in all 1's or 0's?
Because on each loop you assign a single value to the entire column:
   tots_df['orc_4_totals'] = s4    # entire column orc_4_totals = s4!

(the same thing for the other column.
It equals all ones then, just because your final loop value fills it with 1.
You need to insert single values instead, for each row of your target dataframe.
However, because I don't know if your target dataframe tots_df has an existing index, I would suggest first saving the values in a list, then assigning them:
orc_4_values = []
orc_5_values = []
for name in pros_unique:
    # perform your checks, then assign using:
    s4 = df.loc[(df.pros_split == name) &amp; (df.orc_4 == 1)].orc_4.count()
    s5 = df.loc[(df.pros_split == name) &amp; (df.orc_5 == 1)].orc_4.count()
    orc_4_values.append(s4)
    orc_5_values.append(s5)

# Add to dataframe after the loop
tots_df['orc_4_totals'] = orc_4_values
tots_df['orc_5_totals'] = orc_5_values