@@ -213,7 +213,7 @@ def add_flex_arithmetic_methods(cls, flex_arith_method, radd_func=None,
213
213
214
214
Parameters
215
215
----------
216
- flex_arith_method : function (optional)
216
+ flex_arith_method : function
217
217
factory for special arithmetic methods, with op string:
218
218
f(op, name, str_rep, default_axis=None, fill_zeros=None, **eval_kwargs)
219
219
radd_func : function (optional)
@@ -703,12 +703,35 @@ def _radd_compat(left, right):
703
703
704
704
return output
705
705
706
+ _op_descriptions = {'add' : {'op' : '+' , 'desc' : 'Addition' , 'reversed' : False , 'reverse' : 'radd' },
707
+ 'sub' : {'op' : '-' , 'desc' : 'Subtraction' , 'reversed' : False , 'reverse' : 'rsub' },
708
+ 'mul' : {'op' : '*' , 'desc' : 'Multiplication' , 'reversed' : False , 'reverse' : 'rmul' },
709
+ 'mod' : {'op' : '%' , 'desc' : 'Modulo' , 'reversed' : False , 'reverse' : 'rmod' },
710
+ 'pow' : {'op' : '**' , 'desc' : 'Exponential power' , 'reversed' : False , 'reverse' : 'rpow' },
711
+ 'truediv' : {'op' : '/' , 'desc' : 'Floating division' , 'reversed' : False , 'reverse' : 'rtruediv' },
712
+ 'floordiv' : {'op' : '//' , 'desc' : 'Integer division' , 'reversed' : False , 'reverse' : 'rfloordiv' }}
713
+
714
+ _op_names = list (_op_descriptions .keys ())
715
+ for k in _op_names :
716
+ reverse_op = _op_descriptions [k ]['reverse' ]
717
+ _op_descriptions [reverse_op ] = _op_descriptions [k ].copy ()
718
+ _op_descriptions [reverse_op ]['reversed' ] = True
719
+ _op_descriptions [reverse_op ]['reverse' ] = k
706
720
707
721
def _flex_method_SERIES (op , name , str_rep , default_axis = None ,
708
722
fill_zeros = None , ** eval_kwargs ):
723
+ op_name = name .replace ('__' , '' )
724
+ op_desc = _op_descriptions [op_name ]
725
+ if op_desc ['reversed' ]:
726
+ equiv = 'other ' + op_desc ['op' ] + ' series'
727
+ else :
728
+ equiv = 'series ' + op_desc ['op' ] + ' other'
729
+
709
730
doc = """
710
- Binary operator %s with support to substitute a fill_value for missing data
711
- in one of the inputs
731
+ %s of series and other, element-wise (binary operator `%s`).
732
+
733
+ Equivalent to ``%s``, but with support to substitute a fill_value for
734
+ missing data in one of the inputs.
712
735
713
736
Parameters
714
737
----------
@@ -723,7 +746,11 @@ def _flex_method_SERIES(op, name, str_rep, default_axis=None,
723
746
Returns
724
747
-------
725
748
result : Series
726
- """ % name
749
+
750
+ See also
751
+ --------
752
+ Series.%s
753
+ """ % (op_desc ['desc' ], op_name , equiv , op_desc ['reverse' ])
727
754
728
755
@Appender (doc )
729
756
def flex_wrapper (self , other , level = None , fill_value = None , axis = 0 ):
@@ -813,7 +840,48 @@ def na_op(x, y):
813
840
814
841
return result
815
842
816
- @Appender (_arith_doc_FRAME % name )
843
+ if name in _op_descriptions :
844
+ op_name = name .replace ('__' , '' )
845
+ op_desc = _op_descriptions [op_name ]
846
+ if op_desc ['reversed' ]:
847
+ equiv = 'other ' + op_desc ['op' ] + ' dataframe'
848
+ else :
849
+ equiv = 'dataframe ' + op_desc ['op' ] + ' other'
850
+
851
+ doc = """
852
+ %s of dataframe and other, element-wise (binary operator `%s`).
853
+
854
+ Equivalent to ``%s``, but with support to substitute a fill_value for
855
+ missing data in one of the inputs.
856
+
857
+ Parameters
858
+ ----------
859
+ other : Series, DataFrame, or constant
860
+ axis : {0, 1, 'index', 'columns'}
861
+ For Series input, axis to match Series index on
862
+ fill_value : None or float value, default None
863
+ Fill missing (NaN) values with this value. If both DataFrame locations are
864
+ missing, the result will be missing
865
+ level : int or name
866
+ Broadcast across a level, matching Index values on the
867
+ passed MultiIndex level
868
+
869
+ Notes
870
+ -----
871
+ Mismatched indices will be unioned together
872
+
873
+ Returns
874
+ -------
875
+ result : DataFrame
876
+
877
+ See also
878
+ --------
879
+ DataFrame.%s
880
+ """ % (op_desc ['desc' ], op_name , equiv , op_desc ['reverse' ])
881
+ else :
882
+ doc = _arith_doc_FRAME % name
883
+
884
+ @Appender (doc )
817
885
def f (self , other , axis = default_axis , level = None , fill_value = None ):
818
886
if isinstance (other , pd .DataFrame ): # Another DataFrame
819
887
return self ._combine_frame (other , na_op , fill_value , level )
0 commit comments