itholic commented on a change in pull request #33882:
URL: https://github.com/apache/spark/pull/33882#discussion_r699847004



##########
File path: python/pyspark/pandas/namespace.py
##########
@@ -2814,9 +2824,18 @@ def to_numeric(arg):
     1.0
     """
     if isinstance(arg, Series):
-        return arg._with_new_scol(arg.spark.column.cast("float"))
+        if errors == "coerce":
+            return arg._with_new_scol(arg.spark.column.cast("int"))

Review comment:
       I changed it to follow pandas' behavior below:
   
   ```python
   >>> pd.to_numeric(pd.Series(['1', '2', '3']))
   0    1
   1    2
   2    3
   dtype: int64
   
   >>> ps.to_numeric(ps.Series(['1', '2', '3']))
   0    1.0
   1    2.0
   2    3.0
   dtype: float32
   ```
   
   But I'll revert this change since we cannot handle the case below properly 
with this change.
   
   ```python
   >>> pd.to_numeric(pd.Series(['1.0', '2', '-3']))
   0    1.0
   1    2.0
   2   -3.0
   dtype: float64
   
   >>> ps.to_numeric(ps.Series(['1.0', '2', '-3']))
   0    1
   1    2
   2   -3
   dtype: int32
   ```

##########
File path: python/pyspark/pandas/namespace.py
##########
@@ -2814,9 +2824,18 @@ def to_numeric(arg):
     1.0
     """
     if isinstance(arg, Series):
-        return arg._with_new_scol(arg.spark.column.cast("float"))
+        if errors == "coerce":
+            return arg._with_new_scol(arg.spark.column.cast("int"))
+        elif errors == "ignore":
+            scol = arg.spark.column
+            casted_scol = scol.cast("int")
+            return arg._with_new_scol(F.when(casted_scol.isNull(), 
scol).otherwise(casted_scol))

Review comment:
       Yeah I think so.
   
   If the `errors` is "ignore", then the original data is returned as is:
   
   ```python
   >>> pd.to_numeric(pd.Series(["1", "2", "hello"]), errors="ignore")
   0        1
   1        2
   2    hello
   dtype: object
   ```

##########
File path: python/pyspark/pandas/namespace.py
##########
@@ -2814,9 +2824,18 @@ def to_numeric(arg):
     1.0
     """
     if isinstance(arg, Series):
-        return arg._with_new_scol(arg.spark.column.cast("float"))
+        if errors == "coerce":
+            return arg._with_new_scol(arg.spark.column.cast("int"))
+        elif errors == "ignore":
+            scol = arg.spark.column
+            casted_scol = scol.cast("int")
+            return arg._with_new_scol(F.when(casted_scol.isNull(), 
scol).otherwise(casted_scol))

Review comment:
       Yeah I think so.
   
   If the `errors` is "ignore", then the original data is returned as is (if 
it's unable to cast to numeric):
   
   ```python
   >>> pd.to_numeric(pd.Series(["1", "2", "hello"]), errors="ignore")
   0        1
   1        2
   2    hello
   dtype: object
   ```

##########
File path: python/pyspark/pandas/namespace.py
##########
@@ -2814,9 +2824,18 @@ def to_numeric(arg):
     1.0
     """
     if isinstance(arg, Series):
-        return arg._with_new_scol(arg.spark.column.cast("float"))
+        if errors == "coerce":
+            return arg._with_new_scol(arg.spark.column.cast("int"))
+        elif errors == "ignore":
+            scol = arg.spark.column
+            casted_scol = scol.cast("int")
+            return arg._with_new_scol(F.when(casted_scol.isNull(), 
scol).otherwise(casted_scol))
+        elif errors == "raise":
+            raise NotImplementedError("'raise' is not implemented yet, when 
the `arg` is Series.")

Review comment:
       Sounds good. Let me try




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to