2016-11-29 6 views
2

Прежде всего, прошу прощения. Это мой первый опыт использования переполнения стека, поэтому я надеюсь, что я делаю это правильно! Я искал, но не могу найти то, что я ищу. Я тоже совершенно новый с pandas и python :) Я попытаюсь использовать пример, и я постараюсь быть ясным.Pandas Pivot table, как поставить серию столбцов в атрибуте значений

У меня есть блок данных с 30 столбцами, который содержит информацию о корзине покупок, 1 из столбцов (порядок) имеет 2 значения, либо завершенные в процессе. И у меня есть 20 столбцов с предметами, скажем, яблоко, апельсин, бананы ... И мне нужно знать, сколько раз есть яблоко в полном порядке и сколько в порядке выполнения. Я решил использовать сводную таблицу с подсчетом совокупной функции. Это будет небольшой пример dataframe:

Order  | apple | orange | banana | pear | pineapple | ... | 
-----------|-------|--------|--------|------|-----------|------| 
completed | 2 | 4 | 10 | 5 | 1  |  | 
completed | 5 | 4 | 5 | 8 | 3  |  | 
iProgress | 3 | 7 | 6 | 5 | 2  |  | 
completed | 6 | 3 | 1 | 7 | 1  |  | 
iProgress | 10 | 2 | 2 | 2 | 2  |  | 
completed | 2 | 1 | 4 | 8 | 1  |  | 

У меня есть выход, я хочу, но что я ищу более элегантный способ выбора много столбцов без необходимости вводить их вручную.

df.pivot_table(index=['Order'], values=['apple', 'bananas', 'orange', 'pear', 'strawberry', 
    'mango'], aggfunc='count') 

Но я хочу, чтобы выбрать около 15 столбцов, поэтому вместо того, чтобы печатать один от один 15 раз, я уверен, что есть простой способ сделать это с помощью номера столбцов или что-то. Предположим, я хочу выбирать столбцы с 6 по 15.

Я пробовал такие вещи, как values ​​= [df.columns [6:15]], я также пробовал использовать df.iloc, но, как я уже сказал, я «Я довольно новый, поэтому я, вероятно, неправильно использую вещи или делаю глупые вещи!

Есть ли способ получить их в том порядке, в котором они есть? Потому что в моем ответе они, похоже, были заказаны в алфавитном порядке, и я хочу сохранить порядок столбцов. Так оно и должно быть яблоко, апельсин, банан ...

Order  Completed In progress 
apple   92    221 
banana   102   144 
mango   70    55 

Я просто искал способ улучшения моего кода, и я надеюсь, что я не сделал много путаницы. Спасибо!

ответ

2

Я думаю, что вы можете использовать:

#if need select only few columns - df.columns[1:3] 
df = df.pivot_table(columns=['Order'], values=df.columns[1:3], aggfunc='count') 
print (df) 
Order completed iProgress 
apple   4   2 
orange   4   2 

#if need use all column, parameter values can be omit 
df = df.pivot_table(columns=['Order'], aggfunc='count') 
print (df) 

Order  completed iProgress 
apple    4   2 
banana    4   2 
orange    4   2 
pear    4   2 
pineapple   4   2 

What is the difference between size and count in pandas?

df = df.pivot_table(columns=['Order'], aggfunc=len) 
print (df) 
Order  completed iProgress 
apple    4   2 
banana    4   2 
orange    4   2 
pear    4   2 
pineapple   4   2 

#solution with groupby and transpose 
df = df.groupby('Order').count().T 
print (df) 
Order  completed iProgress 
apple    4   2 
orange    4   2 
banana    4   2 
pear    4   2 
pineapple   4   2 
+0

Спасибо за ваш ответ, я попробовал, но я получаю эту ошибку: исключение KeyError: [ «яблоко», ' banana ',' orange '] не в индексе ", когда я использую этот стиль' df = df.pivot_table (columns = [' Order '], values ​​= df.columns [1: 3], aggfunc =' count ') 'So возможно, проблема в другом месте? –

+0

Хорошо, тогда второй и третий столбцы являются 'apple' и' orange'? В образце 'print (df.columns [1: 3])' - 'Index (['apple', 'orange '], dtype =' object ') ' – jezrael

+0

python подсчитывает от' 0', поэтому первый столбец - 'df.columns [0]', второй '1' ... – jezrael

1

Ваш пример не показывает экс достаточно места в корзине. Я предполагаю, что это выглядит как None или 0. Если это верно, то я заполняю на значения и подсчитать, сколько больше, чем 0

df.set_index('Order').fillna(0).gt(0).groupby(level='Order').sum().T 

enter image description here

+0

Да, это работает, но с подсчетом вместо суммы, которую я ищу. Проблема в том, что я не хочу выбирать все столбцы, только некоторые из них, но их слишком много, чтобы вводить их вручную. Вот почему я искал сортировщика. Но это помогает мне с заказом :) –

Смежные вопросы