JuliaPy / JuliaPy/PythonCall.jl

Pandas compatibility

Đang mở
#501 6 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
Julia
Star
1.1k
Fork
86
Merge trung bình
1 ngày 22 giờ
Pull request đã merge (30 ngày)
3

Mô tả

**Affects:** PythonCall

**Describe the bug**

I have been trying to use pandas from PythonCall.jl and just wanted to document a few different calls that do not directly translate to Julia. I guess this might just mean we need a `PythonPandas` package to translate calls but I wonder if there's any missing methods that could be implemented to fix things automatically.

First, the preamble for this:

```julia
using PythonCall

pd = pyimport("pandas")
```

- [ ] **1. Constructing `pandas.DataFrame`:**

Using a similar syntax to Python:

```julia
df = pd.DataFrame(Dict([
"a" => [1, 2, 3],
"b" => [4, 5, 6]
]))
```

which results in the following dataframe:

```julia
julia> df
Python:
0
0 b
1 a
```

i.e., it seems to have a single column named "0" and rows for a and b.

If I instead write this as a vector of pairs, I get:

```julia
julia> pd.DataFrame([
"a" => [1, 2, 3],
"b" => [4, 5, 6]
])
Python:
0 1
0 a [1, 2, 3]
1 b [4, 5, 6]
```

I suppose this one makes sense.

I was able to get it working with the following syntax instead:

```julia
julia> df = pd.DataFrame([
1 4
2 5
3 6
], columns=["a", "b"])
Python:
a b
0 1 4
1 2 5
2 3 6
```

- [ ] **2. Selecting multiple columns**

So, selecting a single column works:

```julia
julia> df["a"]
Python:
0 1
1 2
2 3
Name: a, dtype: int64
```

but multiple columns does not:

```julia
julia> df[["a", "b"]]
ERROR: Python: TypeError: Julia: MethodError: objects of type Vector{String} are not callable
Use square brackets [] for indexing an Array.
Python stacktrace:
[1] __call__
@ ~/.julia/packages/PythonCall/S5MOg/src/JlWrap/any.jl:223
[2] apply_if_callable
@ pandas.core.common ~/Documents/pysr_projects/arya/bigbench/.CondaPkg/env/lib/python3.12/site-packages/pandas/core/common.py:384
[3] __getitem__
@ pandas.core.frame ~/Documents/pysr_projects/arya/bigbench/.CondaPkg/env/lib/python3.12/site-packages/pandas/core/frame.py:4065
Stacktrace:
[1] pythrow()
@ PythonCall.Core ~/.julia/packages/PythonCall/S5MOg/src/Core/err.jl:92
[2] errcheck
@ ~/.julia/packages/PythonCall/S5MOg/src/Core/err.jl:10 [inlined]
[3] pygetitem(x::Py, k::Vector{String})
@ PythonCall.Core ~/.julia/packages/PythonCall/S5MOg/src/Core/builtins.jl:171
[4] getindex(x::Py, i::Vector{String})
@ PythonCall.Core ~/.julia/packages/PythonCall/S5MOg/src/Core/Py.jl:292
[5] top-level scope
@ REPL[18]:1
```

I got around this by inserting a `pylist` call:

```julia
julia> df[pylist(["a", "b"])]
Python:
a b
0 1 4
1 2 5
2 3 6
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.