Skip to content

DOC: update the pandas.DataFrame.apply docstring #20202

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Mar 12, 2018

Conversation

mdeboc
Copy link

@mdeboc mdeboc commented Mar 10, 2018

Checklist for the pandas documentation sprint (ignore this if you are doing
an unrelated PR):

  • PR title is "DOC: update the docstring"
  • The validation script passes: scripts/validate_docstrings.py <your-function-or-method>
  • The PEP8 style check passes: git diff upstream/master -u -- "*.py" | flake8 --diff
  • The html version looks good: python doc/make.py --single <your-function-or-method>
  • It has been proofread on language by another sprint participant

Please include the output of the validation script below between the "```" ticks:

################################################################################
###################### Docstring (pandas.DataFrame.apply) ######################
################################################################################

Apply a function along an axis of the `Series`.

Objects passed to the function are `Series` objects having as index
either the DataFrame's index (`axis=0`)
or the DataFrame's columns (`axis=1`).
If `result_type` is None, the final return type is the return
type of the applied function.
Otherwise, it depends on the `result_type` argument.

Parameters
----------
func : function
    Function to apply to each column or row.
axis : {0 or 'index', 1 or 'columns'}, default 0
    Axis along which the function is applied:

    * 0 or 'index': apply function to each column.
    * 1 or 'columns': apply function to each row.
broadcast : boolean, optional
    Only relevant for aggregation functions:

    * `False` or `None` : returns a `Series` whose length is the length
      of the index or the number of columns (based on the `axis`
      parameter)
    * `True` : results will be broadcast to the original shape
      of the frame, the original index and columns will be retained.

    .. deprecated:: 0.23.0
       This argument will be removed in a future version, replaced
       by result_type='broadcast'.

raw : boolean, default False
    * `False` : passes each row or column into a `Series` to the
      function.
    * `True` : the passed function will receive ndarray objects
      instead.
    If you are just applying a NumPy reduction function this will
    achieve much better performance.
reduce : boolean or None, default None
    Try to apply reduction procedures. If the `DataFrame` is empty,
    :meth:`apply` will use reduce to determine whether the result
    should be a `Series` or a `DataFrame`. If reduce is None (the
    default), :meth:`apply`'s return value will be guessed by calling
    func on an empty `Series`
    (note: while guessing, exceptions raised by `func` will be
    ignored).
    If reduce is True a `Series` will always be returned, and if
    `False` a `DataFrame` will always be returned.

    .. deprecated:: 0.23.0.
       This argument will be removed in a future version, replaced
       by result_type='reduce'.

result_type : {'expand', 'reduce', 'broadcast', None}
    These only act when `axis=1` (columns):

    * 'expand' : list-like results will be turned into columns.
    * 'reduce' : returns a `Series` if possible rather than expanding
      list-like results. This is the opposite of 'expand'.
    * 'broadcast' : results will be broadcast to the original shape
      of the `DataFrame`, the original index and columns will be
      retained.

    The default behaviour (`None`) depends on the return value of the
    applied function: list-like results will be returned as a `Series`
    of those. However if the apply function returns a `Series` these
    are expanded to columns.

    .. versionadded:: 0.23.0.

args : tuple
    Positional arguments to pass to function in addition to the
    array/series.
kwds :
    Additional keyword arguments to pass as keywords to the function.

Notes
-----
In the current implementation apply calls func twice on the
first column/row to decide whether it can take a fast or slow
code path. This can lead to unexpected behavior if func has
side-effects, as they will take effect twice for the first
column/row.

Examples
--------

We use this DataFrame to illustrate

>>> df = pd.DataFrame(np.tile(np.arange(3), 6).reshape(6, -1) + 1,
...                   columns=['A', 'B', 'C'])
>>> df
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

Using a numpy universal function (in this case the same as
``np.sqrt(df)``):

>>> df.apply(np.sqrt)
     A         B         C
0  1.0  1.414214  1.732051
1  1.0  1.414214  1.732051
2  1.0  1.414214  1.732051
3  1.0  1.414214  1.732051
4  1.0  1.414214  1.732051
5  1.0  1.414214  1.732051

Using a reducing function on either axis

>>> df.apply(np.sum, axis=0)
A     6
B    12
C    18
dtype: int64

>>> df.apply(np.sum, axis=1)
0    6
1    6
2    6
3    6
4    6
5    6
dtype: int64

Retuning a list-like will result in a Series

>>> df.apply(lambda x: [1, 2], axis=1)
0    [1, 2]
1    [1, 2]
2    [1, 2]
3    [1, 2]
4    [1, 2]
5    [1, 2]
dtype: object

Passing result_type='expand' will expand list-like results
to columns of a Dataframe

>>> df.apply(lambda x: [1, 2], axis=1, result_type='expand')
   0  1
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
5  1  2

Returning a Series inside the function is similar to passing
``result_type='expand'``. The resulting column names
will be the Series index.

>>> df.apply(lambda x: pd.Series([1, 2], index=['foo', 'bar']), axis=1)
   foo  bar
0    1    2
1    1    2
2    1    2
3    1    2
4    1    2
5    1    2

Passing ``result_type='broadcast'`` will ensure the same shape
result, whether list-like or scalar is returned by the function,
and broadcast it along the axis. The resulting column names will
be the originals.

>>> df.apply(lambda x: [1, 2, 3], axis=1, result_type='broadcast')
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

See also
--------
DataFrame.applymap: For elementwise operations
DataFrame.aggregate: only perform aggregating type operations
DataFrame.transform: only perform transformating type operations

Returns
-------
applied : Series or DataFrame

################################################################################
################################## Validation ##################################
################################################################################

Errors found:
	Errors in parameters section
		Parameters {'kwds'} not documented
		Unknown parameters {'kwds :'}
		Parameter "raw" description should start with capital letter
		Parameter "kwds :" has no type

If the validation script still gives errors, but you think there is a good reason
to deviate in this case (and there are certainly such cases), please state this
explicitly.

Copy link
Member

@jorisvandenbossche jorisvandenbossche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR! Added some first comments

@@ -4818,66 +4818,82 @@ def aggregate(self, func, axis=0, *args, **kwargs):

def apply(self, func, axis=0, broadcast=None, raw=False, reduce=None,
result_type=None, args=(), **kwds):
"""Applies function along an axis of the DataFrame.
"""
Apply a function along an axis of the `Series`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the dataframe docs, so Series -> DataFrame

(also it is not needed to put single backticks around Series and DataFrame, same for the rest of the docstring)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add PR review suggestions from @jorisvandenbossche into commit c593a70

Copy link
Author

@mdeboc mdeboc Mar 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... and commit 4d3e8cf (i.e. the same for DataFrame)

of the index or the number of columns (based on the `axis`
parameter)
* `True` : results will be broadcast to the original shape
of the frame, the original index and columns will be retained.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this keyword is deprecated, I am not sure it is that important to add such a detailed description (I would rather expand the explanation of the new keyword result_type)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jorisvandenbossche OK. But <<results will be broadcast to the original shape of the frame, the original index and columns will be retained.>> is already copied from the explanation of the new keyword result_type. So nothing to add in the paragraph of this new parameter.

Shall I revert to the previous wording for broadcast parameter, i.e.:

'''
broadcast : boolean, optional
    For aggregation functions, return object of same size with values
    propagated
'''

(...which is rather fuzzy),
or not ?

passed function will receive ndarray objects instead. If you are
just applying a NumPy reduction function this will achieve much
better performance
* `False` : passes each row or column into a `Series` to the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"passes each row or column into a Series" -> "passes each row or column as a Series"

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 8caf5f6

Final return type depends on the return type of the applied function,
or on the `result_type` argument.
Objects passed to the function are `Series` objects having as index
either the DataFrame's index (`axis=0`)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you use double backticks around axis=0 (as ``axis=0``) (because it is a small code snippet)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit c1214b4

array/series
Additional keyword arguments will be passed as keywords to the function
array/series.
kwds :
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kwds -> **kwds (and the colon is not needed)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 2432ff5

Copy link
Member

@datapythonista datapythonista left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks quite nice, added some comments.

@@ -4818,66 +4818,82 @@ def aggregate(self, func, axis=0, *args, **kwargs):

def apply(self, func, axis=0, broadcast=None, raw=False, reduce=None,
result_type=None, args=(), **kwds):
"""Applies function along an axis of the DataFrame.
"""
Apply a function along an axis of the `Series`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why did you change DataFrame by Series? The file is frame.py I think it's apply for DataFrame, isn't it?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit c593a70

Objects passed to the function are `Series` objects having as index
either the DataFrame's index (`axis=0`)
or the DataFrame's columns (`axis=1`).
If `result_type` is None, the final return type is the return
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

None in backticks

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add PR review suggestions from @datapythonista into commit da64c86
Maybe result_type is None is better there, because it is a small code snippet.

Axis along which the function is applied:

* 0 or 'index': apply function to each column.
* 1 or 'columns': apply function to each row.
broadcast : boolean, optional
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bool instead of boolean (also in the next 2)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit dbd90c1

are expanded to columns.

.. versionadded:: 0.23.0
.. versionadded:: 0.23.0.

args : tuple
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

args is always a tuple, so we remove it. The validation script will probably complain, but the convention is to use *args and **kwargs (with the stars)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this case we need to keep it as args and the 'tuple' type description is correct. This is a special case because it actually is a keyword with the name args, not *args in the signature

Copy link
Author

@mdeboc mdeboc Mar 10, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, so I keep

args : tuple

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, my fault, sorry.

Additional keyword arguments will be passed as keywords to the function
array/series.
kwds :
Additional keyword arguments to pass as keywords to the function.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A personal opinion, but for me it'd be a bit more explicit to say "to pass as keyword arguments to func". I think saying "the function" should be clear enough for most people, but specifying which functions avoids any ambiguity. Also por args.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 6cbadd8

@@ -4818,66 +4818,82 @@ def aggregate(self, func, axis=0, *args, **kwargs):

def apply(self, func, axis=0, broadcast=None, raw=False, reduce=None,
result_type=None, args=(), **kwds):
"""Applies function along an axis of the DataFrame.
"""
Apply a function along an axis of the `Series`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

`Series` -> DataFrame

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ai, we were all doing the review at the same time :-)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep. Sorry guys :)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TomAugspurger I took into account your suggestion in the commit c593a70

either the DataFrame's index (axis=0) or the columns (axis=1).
Final return type depends on the return type of the applied function,
or on the `result_type` argument.
Objects passed to the function are `Series` objects having as index
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"having as" -> "whose index is either"

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add PR review suggestions from @TomAugspurger into commit eaf1441

Final return type depends on the return type of the applied function,
or on the `result_type` argument.
Objects passed to the function are `Series` objects having as index
either the DataFrame's index (`axis=0`)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

double backticks around axis=0 and axis=1 since they're code snippets.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit c1214b4

passed function will receive ndarray objects instead. If you are
just applying a NumPy reduction function this will achieve much
better performance
* `False` : passes each row or column into a `Series` to the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe "passes each row or column as a Series to the function"

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 8caf5f6

function.
* `True` : the passed function will receive ndarray objects
instead.
If you are just applying a NumPy reduction function this will
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This applies to raw=Ture so keep it under the item formed by that *

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 3794d19

DataFrame will always be returned.

.. deprecated:: 0.23.0
Try to apply reduction procedures. If the `DataFrame` is empty,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't need backticsk around Series / DataFrame

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit c593a70


.. deprecated:: 0.23.0
Try to apply reduction procedures. If the `DataFrame` is empty,
:meth:`apply` will use reduce to determine whether the result
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this resolves to pandas.apply, which doesn't exist. SEe if you can rewreite to avoid the reference to apply

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After running

python make.py html --single pandas.DataFrame.apply

the :meth:apply link resolves to pandas.DataFrame.apply

@TomAugspurger, if it is not the case for you, I shall revert to a wording more like: apply() or DataFrame.apply()... Let me know.

.. deprecated:: 0.23.0
Try to apply reduction procedures. If the `DataFrame` is empty,
:meth:`apply` will use reduce to determine whether the result
should be a `Series` or a `DataFrame`. If reduce is None (the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

backticsk around parameter names (reduce)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit da64c86
Maybe reduce is None is better there, because it is a small code snippet

array/series
Additional keyword arguments will be passed as keywords to the function
array/series.
kwds :
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just updated our docs on this, we're doing **kwds

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 2432ff5

@jreback jreback added Docs Reshaping Concat, Merge/Join, Stack/Unstack, Explode labels Mar 11, 2018
:meth:`apply` will use `reduce` to determine whether the result
should be a Series or a DataFrame. If ``reduce is None`` (the
default), :meth:`apply`'s return value will be guessed by calling
`func` on an empty Series
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jorisvandenbossche can you look at this formatting

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mdeboc Although :meth:`apply` works correctly in sphinx rendering, I would not use the referencing syntax, as it is then just adding a reference to itself ?
I would just do `apply` in this case

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jorisvandenbossche I add this PR review suggestions into commit ee6919e


The default behaviour (None) depends on the return value of the
The default behaviour (`None`) depends on the return value of the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no parens here

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR review suggestions from @jreback was added into commit c4da1ea

or the DataFrame's columns (``axis=1``).
If ``result_type is None``, the final return type is the return
type of the applied function.
Otherwise, it depends on the `result_type` argument.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you reflow this paragraph so each line is more or less <=79 chars?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 23be01b

either the DataFrame's index (``axis=0``)
or the DataFrame's columns (``axis=1``).
If ``result_type is None``, the final return type is the return
type of the applied function.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The final return type is not exactly the same, but it is "inferred from the return type of the applied function"

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add this PR review suggestions into commit 51ad0cb

:meth:`apply` will use `reduce` to determine whether the result
should be a Series or a DataFrame. If ``reduce is None`` (the
default), :meth:`apply`'s return value will be guessed by calling
`func` on an empty Series
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mdeboc Although :meth:`apply` works correctly in sphinx rendering, I would not use the referencing syntax, as it is then just adding a reference to itself ?
I would just do `apply` in this case

@codecov
Copy link

codecov bot commented Mar 12, 2018

Codecov Report

❗ No coverage uploaded for pull request base (master@5b0caf4). Click here to learn what that means.
The diff coverage is 100%.

Impacted file tree graph

@@            Coverage Diff            @@
##             master   #20202   +/-   ##
=========================================
  Coverage          ?    91.7%           
=========================================
  Files             ?      150           
  Lines             ?    49167           
  Branches          ?        0           
=========================================
  Hits              ?    45089           
  Misses            ?     4078           
  Partials          ?        0
Flag Coverage Δ
#multiple 90.09% <100%> (?)
#single 41.86% <100%> (?)
Impacted Files Coverage Δ
pandas/core/frame.py 97.18% <100%> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5b0caf4...c68a012. Read the comment docs.

Copy link
Member

@datapythonista datapythonista left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good work, added some comments, mainly to parts of the original docstring that can be improved.

applied function: list-like results will be returned as a Series
of those. However if the apply function returns a Series these
are expanded to columns.

.. versionadded:: 0.23.0
.. versionadded:: 0.23.0.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a bug in the script, you don't need the period at the end.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok. see cf2f2d0

are expanded to columns.

.. versionadded:: 0.23.0
.. versionadded:: 0.23.0.

args : tuple
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, my fault, sorry.

first column/row to decide whether it can take a fast or slow
code path. This can lead to unexpected behavior if func has
code path. This can lead to unexpected behavior if `func` has
side-effects, as they will take effect twice for the first
column/row.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you get rid of the "We use this DataFrame to illustrate" at the beginning of the examples? I don't think it adds any value.

Also, I'd personally prefer to create a smaller (e.g 3 rows, 2 cols) dataframe from a Python list, instead of all that numpy machinery. :) And if the example is with sqrt, I'd use numbers like 9 so the user can quickly see what apply does, which is the goal of this example.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it's simpler. See d52ac81

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@datapythonista In commit 3160fb8, I suppress an unnecessary test, unintentionally introduced in previous commit (d52ac81)

Copy link
Member

@jorisvandenbossche jorisvandenbossche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some minor comments. Looking good for the rest!

`func` on an empty Series
(note: while guessing, exceptions raised by `func` will be
ignored).
If ``reduce is True`` a Series will always be returned, and if
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"reduce is True" -> "reduce=True" (same on line below and few lines above)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jorisvandenbossche Changes in dfa0f55, but don't forget that this keyword is deprecated, as you mentioned Saturday. :)

instead.
If you are just applying a NumPy reduction function this will
achieve much better performance.
reduce : bool or `None`, default `None`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no backticks are needed inside the type description part

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

changes in 037c729

A B
0 1 2
1 1 2
2 1 2

See also
--------
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you move the Returns and See Also sections to just after the Parameters section?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure
changes in d757960
@jorisvandenbossche maybe the teams working with functions: combine, combine_first, applymap, join and round should do the same...

@pep8speaks
Copy link

pep8speaks commented Mar 12, 2018

Hello @mdeboc! Thanks for updating the PR.

Cheers ! There are no PEP8 issues in this Pull Request. 🍻

Comment last updated on March 12, 2018 at 16:46 Hours UTC

@jorisvandenbossche jorisvandenbossche merged commit 5f244d8 into pandas-dev:master Mar 12, 2018
@jorisvandenbossche
Copy link
Member

@mdeboc Thanks a lot!

@jorisvandenbossche jorisvandenbossche added this to the 0.23.0 milestone Mar 12, 2018
@mdeboc mdeboc deleted the apply_doc_sprint branch March 13, 2018 13:39
@jorisvandenbossche jorisvandenbossche mentioned this pull request Mar 13, 2018
9 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Docs Reshaping Concat, Merge/Join, Stack/Unstack, Explode
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants