【问题标题】:Julia pandas - how to append dataframes togetherJulia pandas - 如何将数据框附加在一起
【发布时间】:2018-09-20 18:24:56
【问题描述】:

使用 Julia 1.0 我有大量数据帧,我使用 pandas (read_csv) 将它们读入 Julia,我正在寻找一种方法将它们全部附加到一个大数据帧中。出于某种原因,“追加”功能无法解决问题。下面是一个简化的例子:

using Pandas 

df = Pandas.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

df2 = Pandas.DataFrame([[5, 6], [7, 8]], columns=['A', 'B'])

df[:append](df2)  #fails

df.append(df2)    #fails

df[:concat](df2)  #fails

vcat(df,df2)       

最后一步有效,但会生成一个 2 元素数组,每个元素都是一个 DataFrame

关于如何将两个数据帧堆叠在一起的任何想法?

【问题讨论】:

  • 现在有 julia Pandas 了吗? *掌心*
  • 它是 python pandas 的包装器。
  • @crstnbr 使用“原生”Julia DataFrames 包是否更快?

标签: pandas dataframe julia pycall


【解决方案1】:

这似乎有效

julia> df = Pandas.DataFrame([[1, 2], [3, 4]], columns=[:A, :B])
   A  B
0  1  2
1  3  4


julia> df2 = Pandas.DataFrame([[5, 6], [7, 8]], columns=[:A, :B])
   A  B
0  5  6
1  7  8


julia> df.pyo[:append](df2, ignore_index = true )
PyObject    A  B
0  1  2
1  3  4
2  5  6
3  7  8

注意事项:

  • 我不知道这是 Pandas 的东西还是 julia 1.0 PyCall 的东西,但该对象在调用方法之前似乎需要明确的 .pyo 字段。如果您尝试使用df[:append],它将尝试将其解释为您尝试索引:append: 列。试试df[:col3] = 3 看看我的意思
  • 有一个 julia 原生 DataFrames 包。除非您有一些奇怪的“我已经准备好代码”问题,否则无需使用 Pandas。即使这样,您也可能只是通过 Julia 中的 Python 层使用 Pandas 使事情复杂化。

作为参考,这里是 julia DataFrames 中的等价物:

julia> df  = DataFrames.DataFrame( [1:2, 3:4], [:A, :B]);
julia> df2 = DataFrames.DataFrame( [5:6, 7:8], [:A, :B]);
julia> append!(df, df2)
4×2 DataFrames.DataFrame
│ Row │ A │ B │
├─────┼───┼───┤
│ 1   │ 1 │ 3 │
│ 2   │ 2 │ 4 │
│ 3   │ 5 │ 7 │
│ 4   │ 6 │ 8 │

【讨论】:

  • 感谢您的回复!我使用 Pandas 的原因是 Julia 原生 CSV.read 读取我需要读取的数百个 csv 文件非常慢。当我在 Julia 中加载 pandas 时,Julia DataFrames 会发生某种冲突并且无法正常工作。我宁愿远离 pandas,但我无法以有效的方式使用 DataFrame。
  • @SilopS 我真的很好奇。 Pandas.jlCSV.jl 之间的DataFrame 构造时间比是多少?你试过CSVFiles.jl吗?它的速度比较如何?
  • CSV.jl 耗时近 2 分钟,而带有 Pandas read_csv 的 Julia 代码耗时约 15 秒。差别很大,尽管我应该修改我最初的评论,说最初我什至无法使用 CSV.jl 读取所有文件,因为它很糟糕。我必须将“rows_for_type_detect=”设置为一个大数字才能成功读取所有文件。在我的情况下,CSVFiles.jl 没有加载,因为“检测到包 JuliaDB 的要求无法满足”。我也无法将 JuliaDB 与我最近下载的 Julia 1.0 一起使用。
  • CSV.jl 正在推出一个新版本,它会使其更快。也许你也可以试试更简单的阅读器CSVReader.jl
【解决方案2】:

既然您说您有很多数据框,您可以将它们添加到列表中。然后 pd.concat 列表,并将第一个文件的标题(假设它们都具有相同的标题)作为新数据帧的标题。这将跳过所有数据框中的第一行,因此您没有一堆标题行。

dfs = [df, df2]

df3 = pd.DataFrame(pd.concat(dfs), columns=df.columns)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多