如何解决如何将Python熊猫转换为Julia DataFrame使用PyJulia并返回到Python Pandas
我想使用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 DataFrame):
PyObject 84
是否可以将熊猫数据框转换为朱莉娅数据框?
编辑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,'ScoreBin'])
Main.df = df;
Main.eval("""
dfj = df |> Pandas.DataFrame|> DataFrames.DataFrame;
""")
但是,尽管我在行的末尾放置了;
,但我总是从dfj获得打印输出,该输出是多余的并且很长(100000行),大约需要一秒钟。有办法避免打印输出吗?
此外,如果我现在在Julia中修改数据框(这比在python和整个问题的目标中这样做要快得多),并希望将其转换回python pandas,我也会收到错误消息>
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,'ScoreBin'])
Main.df = df;
Main.eval("""
dfj = df |> Pandas.DataFrame|> DataFrames.DataFrame;
for i = 1:length(dfj[:,:ScoreBin] = 1
end
end
dfjp = dfj |> Pandas.DataFrame;
"""
)
dfjpy = Main.dfjp
dfjpy
解决方法
您需要安装Pandas.jl
。该库将处理Julia的Python熊猫数据框,以使其保持理智,然后您可以将其转换为DataFrames.jl
。
这是Julia代码(假设dfj
是您的Python变量):
import DataFrames
import Pandas
juliandf = dfj |> Pandas.DataFrame |> DataFrames.DataFrame;
请注意,最后一行也可以写为:
C= DataFrames.DataFrame(Pandas.DataFrame(dfj));
要转换回Pandas.DataFrame(juliandf)
应该可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。