Я очень озадачен тем, как df.apply()
работает.Вот одна из проблем, которые у меня есть:
import seaborn as sns
tips = sns.load_dataset("tips")
tips['tip_pct'] = tips['tip'] / tips['total_bill']
tips.head()
total_bill tip smoker day time size tip_pct
0 16.99 1.01 No Sun Dinner 2 0.059447
1 10.34 1.66 No Sun Dinner 3 0.160542
2 21.01 3.50 No Sun Dinner 3 0.166587
3 23.68 3.31 No Sun Dinner 2 0.139780
4 24.59 3.61 No Sun Dinner 4 0.146808
Я пытаюсь отсортировать столбец tips
по tips['tip_pct']
.Я могу применить sort_values
напрямую.
In [153]: tips.sort_values(by='tip_pct').head()
Out[153]:
total_bill tip smoker day time size tip_pct
237 32.83 1.17 Yes Sat Dinner 2 0.035638
102 44.30 2.50 Yes Sat Dinner 3 0.056433
57 26.41 1.50 No Sat Dinner 2 0.056797
0 16.99 1.01 No Sun Dinner 2 0.059447
187 30.46 2.00 Yes Sun Dinner 5 0.065660
Теперь я пытаюсь сгруппировать этот фрейм данных сначала по столбцу smoker
и отсортировать по столбцу tip_pct
.
In [156]: tips.groupby('smoker').apply(lambda x: x.sort_values(by='tip_pct')).head()
Out[156]:
total_bill tip smoker day time size tip_pct
smoker
No 57 26.41 1.50 No Sat Dinner 2 0.056797
0 16.99 1.01 No Sun Dinner 2 0.059447
48 28.55 2.05 No Sun Dinner 3 0.071804
146 18.64 1.36 No Thur Lunch 3 0.072961
130 19.08 1.50 No Thur Lunch 2 0.078616
Я пытался понять, как groupby
и apply
работают вместе, поэтому я попробовал следующее, но это не удалось.
In [157]: for name, group in tips.groupby('smoker'):
...: group.apply(lambda x: x.sort_values(by='tip_pct'))
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-157-5b5096eaa4d6> in <module>()
1 for name, group in tips.groupby('smoker'):
----> 2 group.apply(lambda x: x.sort_values(by='tip_pct'))
3
//anaconda/lib/python3.5/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
4260 f, axis,
4261 reduce=reduce,
-> 4262 ignore_failures=ignore_failures)
4263 else:
4264 return self._apply_broadcast(f, axis)
//anaconda/lib/python3.5/site-packages/pandas/core/frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
4356 try:
4357 for i, v in enumerate(series_gen):
-> 4358 results[i] = func(v)
4359 keys.append(v.name)
4360 except Exception as e:
<ipython-input-157-5b5096eaa4d6> in <lambda>(x)
1 for name, group in tips.groupby('smoker'):
----> 2 group.apply(lambda x: x.sort_values(by='tip_pct'))
3
TypeError: ("sort_values() got an unexpected keyword argument 'by'", 'occurred at index total_bill')
Я понимаю причину сбоя в том, что функция apply()
пытаетсядо sort_value
в каждом столбце, поэтому by
не применяется к series.sort_values()
.Однако я не понимаю, почему у groupby
нет проблем.согласно моему пониманию, groupby
просто разделяет набор данных, так что это все еще несколько меньших фреймов данных, которые будут иметь проблемы, подобные описанным выше при применении sort_values()
.
Может кто-нибудь объяснить, почему groupby
и apply(sort_values)
не имеют проблем, вызванных прямым применением sort_values
к исходному фрейму данных?
Заранее спасибо!