Count number of gemstones in a set of minerals
You need to stop iterating over indexes and loop like a native. A first rewrite with that in mind would yield:

def gemstones(collection):
    collection = [''.join(set(rock)) for rock in collection]
    biggest_rock = max(collection, key=len)

    count = 0
    for mineral in biggest_rock:
        for rock in collection:
            if mineral not in rock:
                break
        else:
            count += 1
    return count


This version make use for the for...else construct. But the all() builtin would be more expressive:

def gemstones(collection):
    collection = [''.join(set(rock)) for rock in collection]
    biggest_rock = max(collection, key=len)

    count = 0
    for mineral in biggest_rock:
        if all(mineral in rock for rock in collection):
            count += 1

    return count


And counting a condition in a for-loop can be more efficient using sum():

def gemstones(collection):
    collection = [''.join(set(rock)) for rock in collection]
    biggest_rock = max(collection, key=len)

    return sum(
        all(mineral in rock for rock in collection)
        for mineral in biggest_rock
    )


Other than that, you won't have more gemstones than the amount of minerals in the smallest rock, so why doing extra work by using the biggest one to start with?



But you are going back and forth between strings and sets when the problem clearly calls for set intersection repeated on several elements of an array. Luckily, the set.intersection method accept a variable number of arguments. Just make sure to catch any error thrown in case the original collection is empty:

def gemstone(collection):
    rocks = map(set, collection)
    try:
        minerals = next(rocks)
    except StopIteration:
        return 0  # If the collection is empty, there is no gemstones
    return len(minerals.intersection(*rocks))