No IPython eu faço groupby
no quadro de dados regular:
grouped
Out[356]: <pandas.core.groupby.DataFrameGroupBy object at 0x7f0e78578750>
Mas filter
parece estar recebendo séries em vez de quadros de dados:
...: def print_obj(x):
...: print type(x)
...: return True
...:
e=grouped.filter(print_obj)
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.series.Series">
<class "pandas.core.frame.DataFrame">
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-349-a93d384d3560> in <module>()
----> 1 e=grouped.filter(print_obj)
/home/user/anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in filter(self, func, dropna, *args, **kwargs)
2092 res = path(group)
2093
-> 2094 if res:
2095 indexers.append(self.obj.index.get_indexer(group.index))
2096
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
No entanto, quando eu faço apply
, Estou recebendo apenas quadros de dados:
grouped.apply(print_obj)
<class "pandas.core.frame.DataFrame">
...
filter
docstring diz que eu deveria estar recebendo Dataframes. Por quê? E como posso corrigir isso? (Quero simplesmente eliminar alguns grupos do agrupado por df).
P.S. pandas == 0.12.0
Respostas:
2 para resposta № 1Internamente, apply
e filter
tente maneiras diferentes de fazer um loop pelos dados: um "caminho lento" que funcionará para qualquer função e um "caminho rápido" que funciona apenas para algumas funções. Esses caminhos podem operar em lotes inteiros de dados (como um DataFrame) ou uma linha de cada vez (como Série).
Os detalhes são sutis - veja pandas/core/groupby.py
se você quiser - mas a essência é que print_obj
está revelando alguns desses internos que não são germain para o que você realmente deseja fazer.
Quais grupos você deseja abandonar e qual critério você está tentando usar?