pandas: df.apply () закулисное вычисление с помощью df.groupby () - PullRequest
0 голосов
/ 25 апреля 2018

Я очень озадачен тем, как 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 к исходному фрейму данных?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...