У меня есть DataFrame с таким временным рядом:
timestamp v IceCreamOrder Location
2018-01-03 02:21:16 Chocolate South
2018-01-03 12:41:12 Vanilla North
2018-01-03 14:32:15 Strawberry North
2018-01-03 15:32:15 Strawberry North
2018-01-04 02:21:16 Strawberry North
2018-01-04 02:21:16 Rasberry North
2018-01-04 12:41:12 Vanilla North
2018-01-05 15:32:15 Chocolate North
И я хочу, чтобы такие подсчеты были следующими:
timestamp strawberry chocolate
1/2/14 0 1
1/3/14 2 0
1/4/14 1 0
1/4/14 0 0
1/4/14 0 0
1/5/14 0 1
Поскольку это данные временных рядов, я сохраняю временную метку в формате pandas datetimeindex.
Я начал с того, что пытался подсчитать "клубнику". Я закончил с этим кодом, который не работает.
mydf = (inputdf.set_index('timestamp').groupby(pd.Grouper(freq = 'D'))['IceCreamOrder'].count('Strawberry'))
Это приводит к ошибке:
TypeError: count() takes 1 positional argument but 2 were given
Любая помощь будет принята с благодарностью.
Используйте eq
(==
) для сравнения столбца по string
и суммарной sum
для значений True
, потому что True
- это процессы, такие как 1
s:
#convert to datetimes if necessary
inputdf['timestamp'] = pd.to_datetime(inputdf['timestamp'], format='%m/%d/%y')
print (inputdf)
timestamp IceCreamOrder Location
0 2018-01-02 Chocolate South
1 2018-01-03 Vanilla North
2 2018-01-03 Strawberry North
3 2018-01-03 Strawberry North
4 2018-01-04 Strawberry North
5 2018-01-04 Rasberry North
6 2018-01-04 Vanilla North
7 2018-01-05 Chocolate North
mydf = (inputdf.set_index('timestamp')['IceCreamOrder']
.eq('Strawberry')
.groupby(pd.Grouper(freq = 'D'))
.sum())
print (mydf)
timestamp
2018-01-02 0.0
2018-01-03 2.0
2018-01-04 1.0
2018-01-05 0.0
Freq: D, Name: IceCreamOrder, dtype: float64
Если хотите посчитать все type
добавить столбец IceCreamOrder
в groupby
и совокупного GroupBy.size
:
mydf1 = (inputdf.set_index('timestamp')
.groupby([pd.Grouper(freq = 'D'), 'IceCreamOrder'])
.size())
print (mydf1)
timestamp IceCreamOrder
2018-01-02 Chocolate 1
2018-01-03 Strawberry 2
Vanilla 1
2018-01-04 Rasberry 1
Strawberry 1
Vanilla 1
2018-01-05 Chocolate 1
dtype: int64
mydf1 = (inputdf.set_index('timestamp')
.groupby([pd.Grouper(freq = 'D'),'IceCreamOrder'])
.size()
.unstack(fill_value=0))
print (mydf1)
IceCreamOrder Chocolate Rasberry Strawberry Vanilla
timestamp
2018-01-02 1 0 0 0
2018-01-03 0 0 2 1
2018-01-04 0 1 1 1
2018-01-05 1 0 0 0
Если у всех datetime
нет time
s:
mydf1 = (inputdf.groupby(['timestamp', 'IceCreamOrder'])
.size()
.unstack(fill_value=0))
print (mydf1)
IceCreamOrder Chocolate Rasberry Strawberry Vanilla
timestamp
2018-01-02 1 0 0 0
2018-01-03 0 0 2 1
2018-01-04 0 1 1 1
2018-01-05 1 0 0 0
Использование pivot_table
:
df.pivot_table(
index='timestamp', columns='IceCreamOrder', aggfunc='size'
).fillna(0).astype(int)
IceCreamOrder Chocolate Rasberry Strawberry Vanilla
timestamp
2018-01-02 1 0 0 0
2018-01-03 0 0 2 1
2018-01-04 0 1 1 1
2018-01-05 1 0 0 0
Или crosstab
:
pd.crosstab(df.timestamp, df.IceCreamOrder)
IceCreamOrder Chocolate Rasberry Strawberry Vanilla
timestamp
2018-01-02 1 0 0 0
2018-01-03 0 0 2 1
2018-01-04 0 1 1 1
2018-01-05 1 0 0 0
если ваш столбец timestamp
имеет время, просто удалите их перед использованием этих операций с помощью dt.date
(если вы не хотите изменять столбец, возможно, создайте новую серию, которая будет использоваться для поворота):
df.timestamp = df.timestamp.dt.date
chocolate
иstrawberry
? Или все типы