如何将Python pandas转换为Julia数据帧(使用PyJulia)并返回到Python pandas

如何将Python pandas转换为Julia数据帧(使用PyJulia)并返回到Python pandas,python,pandas,dataframe,julia,julia-dataframe,Python,Pandas,Dataframe,Julia,Julia Dataframe,我想使用PyJulia来加速代码的某些部分 import numpy as np import julia import pandas as pd import random from julia import Base from julia import Main from julia import DataFrames n = 100000 randomlist = [] for i in range(0,n): num = random.randint(1,100) ra

我想使用
PyJulia
来加速代码的某些部分

import numpy as np
import julia
import pandas as pd
import random
from julia import Base
from julia import Main
from julia import DataFrames

n = 100000
randomlist = []
for i in range(0,n):
    num = random.randint(1,100)
    randomlist.append(num)

data = {
    'Score': list(randomlist),
        'ScoreBin': list(np.zeros(n))
           }
df = pd.DataFrame(data, columns = ['Score', 'ScoreBin'])
Main.dfj = df

Main.eval(""" 
for i = 1:10
    #println(i)
    if dfj.Score[i] >= 10
        println(dfj.Score[i])
    end
end
"""
)
但是,我收到以下错误消息:

JuliaError: Exception 'TypeError: non-boolean (PyObject) used in boolean context' occurred while calling julia code:
此外,还有以下命令:

Main.eval(""" 
println(dfj.Score[1])
"""
)
给出输出(看起来不是Julia数据帧):

有没有办法将pandas数据帧转换为Julia数据帧

编辑1

感谢@PrzemyslawSzufel的回答,下面的代码现在可以工作了:

import numpy as np
import julia
import pandas as pd
import random
import copy
from julia import Base
from julia import Main
from julia import DataFrames
from julia import Pandas
#julia.install(DataFrame)
%load_ext julia.magic

n = 100000
randomlist = []
for i in range(0,n):
    num = random.randint(1,100)
    randomlist.append(num)

data = {
    'Score': list(randomlist),
        'ScoreBin': list(np.zeros(n))
           }
df = pd.DataFrame(data, columns = ['Score', 'ScoreBin'])
Main.df = df;

Main.eval("""
dfj = df |> Pandas.DataFrame|> DataFrames.DataFrame;
""")
然而,虽然我放了一个
在行尾,我总是从dfj得到一个打印输出,这是不需要的,很长(100000行),大约需要一秒钟。有没有办法避免打印输出

此外,如果我现在在Julia中修改数据帧(这比在python中修改要快得多,也是整个问题的目标),并希望它将其转换回python格式,那么我也会得到一个错误

Main.eval(""" 
for i = 1:length(dfj[:, :Score])
    if dfj[i, :Score] > 50
        dfj[i, :ScoreBin] = 1 
    end
end
"""
)

dfjpy = pd.DataFrame(Main.dfj)
dfjpy


RuntimeError: Julia exception: MethodError: no method matching iterate(::DataFrames.DataFrame)
Closest candidates are:
  iterate(!Matched::Core.SimpleVector) at essentials.jl:568
  iterate(!Matched::Core.SimpleVector, !Matched::Any) at essentials.jl:568
  iterate(!Matched::ExponentialBackOff) at error.jl:199
  ...
Stacktrace:
 [1] jlwrap_iterator(::DataFrames.DataFrame) at /Users/mymac/.julia/packages/PyCall/zqDXB/src/pyiterator.jl:144
 [2] pyjlwrap_getiter(::Ptr{PyCall.PyObject_struct}) at /Users/mymac/.julia/packages/PyCall/zqDXB/src/pyiterator.jl:125
顺便说一下,命令
type(dfjpy)
PyCall.jlwrap
作为输出

编辑2

为了将julia数据帧转换为Python Pandas,必须首先将其转换为julia Pandas。是最新的工作代码

n = 100000
randomlist = []
for i in range(0,n):
    num = random.randint(1,100)
    randomlist.append(num)

data = {
    'Score': list(randomlist),
        'ScoreBin': list(np.zeros(n))
           }
df = pd.DataFrame(data, columns = ['Score', 'ScoreBin'])
Main.df = df;

Main.eval("""
dfj = df |> Pandas.DataFrame|> DataFrames.DataFrame;

for i = 1:length(dfj[:, :Score])
    if dfj[i, :Score] > 50
        dfj[i, :ScoreBin] = 1 
    end
end

dfjp = dfj |> Pandas.DataFrame;
"""
)

dfjpy = Main.dfjp
dfjpy

您需要安装
Pandas.jl
。此库将使用Julia处理Python pandas数据帧,以确保其完整性,然后您可以将其转换为
DataFrames.jl

下面是Julia代码(假设
dfj
是Python变量):

请注意,最后一行也可以写为:

C= DataFrames.DataFrame(Pandas.DataFrame(dfj));

要转换回Pandas.DataFrame(juliandf)
应该可以工作。

您需要安装
Pandas.jl
。此库将使用Julia处理Python pandas数据帧,以确保其完整性,然后您可以将其转换为
DataFrames.jl

下面是Julia代码(假设
dfj
是Python变量):

请注意,最后一行也可以写为:

C= DataFrames.DataFrame(Pandas.DataFrame(dfj));

要转换回Pandas.DataFrame(juliandf)应该可以工作。

非常感谢您的回答@PrzemyslawSzufel。代码有效(我编辑了问题)。但是,有没有办法避免行juliandf=dfj |>Pandas.DataFrame |>DataFrames.DataFrame的打印输出?如何将Julia DataFrames转换回Python pandas呢?在最新的工作代码中,这两个问题似乎都解决了,多亏了您的回答@PrzemyslawSzufel。代码有效(我编辑了问题)。但是,有没有办法避免行juliandf=dfj |>Pandas.DataFrame |>DataFrames.DataFrame的打印输出?如何将Julia数据帧转换回Python数据帧呢?在最新的工作代码中,这两个问题似乎都已经解决了
C= DataFrames.DataFrame(Pandas.DataFrame(dfj));