Вы также можете попробовать это:
tmp = df.apply(lambda x: collections.Counter(x).most_common())
df_freq = pd.DataFrame(tmp,columns=['item_frequency_tuple'])
print(df_freq)
Дает:
frequency
A [(1, 2), (2, 2), (3, 1), (5, 1)]
B [(10, 3), (300, 1), (400, 1), (500, 1)]
C [(q, 4), (p, 2)]
Если вы заботитесь о скорости, никогда не используйте применить:
%%timeit
tmp = df.apply(lambda x: collections.Counter(x).most_common())
df_freq = pd.DataFrame(tmp,columns=['item_frequency_tuple'])
#1.33 ms ± 14.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
vals = df.values.T
tmp = [ collections.Counter(vals[i]).most_common() for i in range(len(vals)) ]
df_freq = pd.DataFrame(np.array(tmp).T, columns=['item_frequency_tuple'])
# 430 µs ± 1.97 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)