2016-06-07 3 views
0

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

 date  amount  type 
0 20160101  50  apple 
1 20160101  50  apple 
2 20160101  50  banana 
3 20160102  30  apple   
4 20160102  50  apple 
5 20160102  40  banana 
6 20160102  40  banana 

То, что я хочу сделать, это подсчитать частоту появления строки, используя все столбцы, и результат должен быть что-то вроде

date  amount  type  times 
20160101 50   apple  2 
20160101 50   banana 1 
20160102 30   apple  1 
20160102 50   apple  1 
20160102 40   banana 2 

Мой код подобен

df 
Out[23]: 
     Date Amount Type 
0 20160101  50 apple 
1 20160101  50 apple 
2 20160101  50 banana 
3 20160102  30 apple 
4 20160102  50 apple 
5 20160102  40 banana 
6 20160102  40 banana 

P=df.pivot_table('Amount','Date','Type') 

P 
Out[27]: 
Type  apple banana 
Date     
20160101  50  50 
20160102  40  40 
+0

Вы попробовали какое-либо решение? –

+0

В любом случае я могу это сделать? = да. Что вы пробовали? – glls

+0

@ NagarajTantri Я знаю только, как подсчитать частоту определенного значения, но это не то, что я хочу. – xzt

ответ

1

Вот хак, который получит вы ваш ответ. Я чувствую, что должен быть более прямой путь, хотя

df['times'] = 1 
df.groupby(['Date', 'Amount', 'Type'], as_index=False).sum() 

EDIT:

нашел второе решение (вы должны переименовать столбец

df.groupby(['date','type']).amount.value_counts().reset_index() 
+0

Спасибо! Оно работает. – xzt

1
>>> df.groupby(['date', 'amount', 'type']).size().reset_index() 
     date amount type 0 
0 20160101  50 apple 2 
1 20160101  50 banana 1 
2 20160102  30 apple 1 
3 20160102  40 banana 2 
4 20160102  50 apple 1 

или вы можете использовать agg.

Если сигнал передан , ключи будут использоваться для обозначения столбцов. В противном случае будет использоваться имя функции (сохраненное в функциональном объекте).

df.groupby(['date', 'amount', 'type']).type.agg({'times': 'size'}).reset_index() 
     date amount type times 
0 20160101  50 apple  2 
1 20160101  50 banana  1 
2 20160102  30 apple  1 
3 20160102  40 banana  2 
4 20160102  50 apple  1 
+0

Возможно, лучше использовать 'df.groupby (['date', 'amount', 'type']). Size(). Reset_index (name = 'times')' – jezrael

+0

Или 'df.groupby (['date', 'amount', 'type'], sort = False) .size(). reset_index (name = 'times') ' – jezrael

+0

Спасибо! И мне было интересно, так или иначе, я могу показать результат на гистограмме? Я попытался использовать .plot (kind = 'hist'), но сюжет выглядел проводным. – xzt

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