Repository: narwhals-dev/narwhals

Issue:
[Bug]: pandas cast not working
### Describe the bug

import polars as pl
import pandas as pd
df_polars = pl.DataFrame({'a': [1]})
nw.from_native(df_polars).select(nw.col("a").cast(nw.String) + "hi")

df_pandas = pd.DataFrame({'a': [1]})
nw.from_native(df_pandas).select(nw.col("a").cast(nw.String) + "hi")

polars succeeds, pandas fails with TypeError: unsupported operand type(s) for +: 'int' and 'str'

### Steps or code to reproduce the bug

see description

### Expected results

it works as polars works

### Actual results

TypeError: unsupported operand type(s) for +: 'int' and 'str'

### Versions

```shell
narwhals==0.9.1
pandas==1.5.3
polars==0.20.26
```


### Relevant log output

_No response_

Discussion:

Patch:
diff --git a/narwhals/_pandas_like/utils.py b/narwhals/_pandas_like/utils.py
index 74dd9682..37c69173 100644
--- a/narwhals/_pandas_like/utils.py
+++ b/narwhals/_pandas_like/utils.py
@@ -437,7 +437,6 @@ def reverse_translate_dtype(  # noqa: PLR0915
     from narwhals import dtypes
 
     dtype_backend = get_dtype_backend(starting_dtype, implementation)
-
     if isinstance_or_issubclass(dtype, dtypes.Float64):
         if dtype_backend == "pyarrow-nullable":
             return "Float64[pyarrow]"
@@ -514,7 +513,7 @@ def reverse_translate_dtype(  # noqa: PLR0915
         if dtype_backend == "pandas-nullable":
             return "string"
         else:
-            return object
+            return str
     if isinstance_or_issubclass(dtype, dtypes.Boolean):
         if dtype_backend == "pyarrow-nullable":
             return "boolean[pyarrow]"


Test patch:
diff --git a/tests/series/cast_test.py b/tests/series/cast_test.py
new file mode 100644
index 00000000..23bdf8e4
--- /dev/null
+++ b/tests/series/cast_test.py
@@ -0,0 +1,18 @@
+import pandas as pd
+import polars as pl
+
+import narwhals as nw
+
+
+def test_cast_253() -> None:
+    df_polars = pl.DataFrame({"a": [1]})
+    result = nw.from_native(df_polars, eager_only=True).select(
+        nw.col("a").cast(nw.String) + "hi"
+    )["a"][0]
+    assert result == "1hi"
+
+    df_pandas = pd.DataFrame({"a": [1]})
+    result = nw.from_native(df_pandas, eager_only=True).select(
+        nw.col("a").cast(nw.String) + "hi"
+    )["a"][0]
+    assert result == "1hi"