Python: построить объект данных Pandas - PullRequest
0 голосов
/ 30 июня 2018

У меня есть фрейм данных, который имеет dtype=object, то есть категориальные переменные, для которых я хотел бы иметь счет каждого уровня. Я хотел бы, чтобы результат был довольно кратким изложением всех категориальных переменных.

Для достижения вышеупомянутых целей я попробовал следующее:

(строка 1) захватить имена всех переменных типа объекта

(строка 2) подсчитывает количество наблюдений для каждого уровня (a, b из v1)

(строка 3) переименуйте столбец, чтобы он читал "count"

stringCol = list(df.select_dtypes(include=['object'])) # list object of categorical variables
a = df.groupby(stringCol[0]).agg({stringCol[0]: 'count'})
a = a.rename(index=str, columns={stringCol[0]: 'count'}); a
    count
v1  
a   1279
b   2382

Я не уверен, как изящно получить следующий результат, в котором печатаются все строки столбцов. Как и в этом случае (показаны только v1 и v4, но должны быть в состоянии печатать такие результаты для переменного числа столбцов):

    count       count
v1           v4
a   1279     l  32
b   2382     u  3055
             y  549

Вот как я могу это сделать:

  1. выберите один элемент из stringCol
  2. рассчитать количество для каждой группы столбца.
  3. сохранить результат в кадре данных Pandas.
  4. сохранить фрейм данных Pandas в объекте (список?)
  5. повтор
  6. если последний элемент из stringCol выполнен, разбить.

но должен быть лучший способ, просто не уверен, как это сделать.

1 Ответ

0 голосов
/ 30 июня 2018

Я думаю, что проще всего использовать цикл:

df = pd.DataFrame({'A':list('abaaee'),
                   'B':list('abbccf'),
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4],
                   'F':list('aacbbb')})

print (df)
   A  B  C  D  E  F
0  a  a  7  1  5  a
1  b  b  8  3  3  a
2  a  b  9  5  6  c
3  a  c  4  7  9  b
4  e  c  2  1  2  b
5  e  f  3  0  4  b

stringCol = list(df.select_dtypes(include=['object']))

for c in stringCol:
    a = df[c].value_counts().rename_axis(c).to_frame('count')
    #alternative
    #a = df.groupby(c)[c].count().to_frame('count')
    print (a)

   count
A       
a      3
e      2
b      1
   count
B       
b      2
c      2
a      1
f      1
   count
F       
b      3
a      2
c      1

Для list of DataFrames используйте list comprehension:

dfs = [df[c].value_counts().rename_axis(c).to_frame('count') for c in stringCol]
print (dfs)

[   count
A       
a      3
e      2
b      1,    count
B       
b      2
c      2
a      1
f      1,    count
F       
b      3
a      2
c      1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...