Как узнать количество столбцов в пандах? - PullRequest
2 голосов
/ 27 сентября 2019

Мне было интересно, как получить подсчет частоты элементов кадра данных панд, как в следующем вопросе:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1,1,2,3,5,2],
                  'B': [10,10,10,300,400,500],
                  'C': ['p','p','q','q','q','q']})


print(df)
   A    B  C
0  1   10  p
1  1   10  p
2  2   10  q
3  3  300  q
4  5  400  q
5  2  500  q

Требуемый вывод

 A          B         C
(1,2)     (10,3)     ('p', 2)
(2,2)     (300,1)    ('q', 4)
(3,1)     (400,1)
(5,1)     (500,1)

Ответы [ 3 ]

2 голосов
/ 27 сентября 2019

Вы также можете попробовать:

s=df.stack().groupby(df.stack()).transform('count').unstack()
final=pd.concat([df,s])
final.groupby(final.index).agg(tuple)

       A         B       C
0  (1, 2)   (10, 3)  (p, 2)
1  (1, 2)   (10, 3)  (p, 2)
2  (2, 2)   (10, 3)  (q, 4)
3  (3, 1)  (300, 1)  (q, 4)
4  (5, 1)  (400, 1)  (q, 4)
5  (2, 2)  (500, 1)  (q, 4)
2 голосов
/ 27 сентября 2019

Вы можете составить список из Counter объектов для каждого столбца и восстановить кадр данных:

from collections import Counter

c = [Counter(j for j in i).items() for i in df.values.T]
pd.DataFrame.from_records(c, index=df.columns).T

  A         B       C
0  (1, 2)   (10, 3)  (p, 2)
1  (2, 2)  (300, 1)  (q, 4)
2  (3, 1)  (400, 1)    None
3  (5, 1)  (500, 1)    None

Для того, чтобы отсортированные значения:

from operator import itemgetter
c = [sorted(
            Counter(j for j in i).items(), 
            key=itemgetter(1), 
            reverse=True) 
     for i in df.values.T]
pd.DataFrame.from_records(c, index=df.columns).T

     A         B       C
0  (1, 2)   (10, 3)  (q, 4)
1  (2, 2)  (300, 1)  (p, 2)
2  (3, 1)  (400, 1)    None
3  (5, 1)  (500, 1)    None
1 голос
/ 27 сентября 2019

Вы также можете попробовать это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...