Reasons:
- To have a different sort order for the columns within a row. The comparator is specified at column family creation time and can't be changed afterwards. So if you have rows which columns must be sorted alphabetically or numerically you have to create different column families.
- Customize the storage options that can be set on per column family basis. E.g. caching or rows, compaction, deletion of expired columns, etc. Per column family storage options can be found here
- Can't mix counter and non-counter columns in the same column family
- As mentioned in other answers, due to logical cohesion - columns represent attributes of some entity identified by the row id.