如何将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));