【问题标题】:What is the most efficient way to join multiple tables with the same index/col?连接具有相同索引/列的多个表的最有效方法是什么?
【发布时间】:2015-01-29 22:20:33
【问题描述】:

我有多个这样的表格保存在 CSV 中。

Table 1: Columns A,B
Table 2: Columns A,C
Table 3: Columns A,D
Table 4: Columns A,E
Table 5: Columns A,F
Table 6: Columns A,G

所有值都是浮点数,A 列除外。A 列未设置为索引,尽管使用 pandas 我有该选项。在所有表中,A 列的所有条目都是相同的。

我想创建一个包含 A、B、C、D、E、F、G 列的表,以便计算 B-G 列的加权和。我有两个一般的想法:

  1. 用这些列创建 pandas 数据框的最佳方法是什么?所谓“最佳”,我的意思是保持内存低,并希望利用某种并行计算。

  2. 我想将这个数据帧保存在磁盘上,所以我想也许有更好的方法可以使用 sed/awk/cut 等命令行工具来获取 csv,然后我可以加载它。有什么提示吗?

【问题讨论】:

    标签: python bash awk sed pandas


    【解决方案1】:

    我只会从 CSV 中读取数据,加入,转储到主 CSV。

    类似:

    data = None
    filelist = ['CSV1.csv', 'otherfile.csv', ..., 'Lastfile.csv']
    for f in filelist:
        if data is None:
            data = pandas.read_csv(f, index_col='A')
        else:
            data = data.join(pandas.read_csv(f, index_col='A'))
    
    data.to_csv('Big.csv')
    

    【讨论】:

      【解决方案2】:

      如果不发布一些具体的输入和预期的输出,很难说,但听起来 UNIX 实用程序 join 就是您正在寻找的。​​p>

      【讨论】:

      • 我对此的看法是 50/50,但似乎 cmets 最适合询问有关改进问题或答案的更多信息或建议方法。我这里都不做,我建议答案是join
      • 我认为建议是有效的 cmets,尤其是在像这样的开放式问题上。公平地说,答案可能是加入!
      【解决方案3】:

      如果你想在磁盘上持久化大量数据,csv 是错误的方法,没有标准,唯一的数据类型是字符。 csv 的用例是当您有少量数据需要关注时,并且您是唯一需要访问数据的人,因此缺乏标准并不是什么大问题。但即使它只是为你准备的,如果你稍后再回到你的数据,你会记得你使用的所有规范和编码数据的条件吗?对于相当小的数据集,这不是什么问题,因为您可以直观地检查整个事物。对于较大的数据集,您应该使用 sqlite 或更高级的关系数据库来持久化数据。

      问。 “连接具有相同索引/列的多个表的最有效方法是什么?”

      我认为pd.merge 可能是最好的方法。以下是一些示例数据:

      >>> import pandas as pd
      >>> t1 = pd.DataFrame({'a': [1,2,3,4], 'b': [5,5,5,5]})
      >>> t2 = pd.DataFrame({'a': [1,2,3,4], 'c': [6,6,6,6]})
      >>> t3 = pd.DataFrame({'a': [1,2,3,4], 'd': [7,7,7,7]})
      

      不幸的是,merge 一次只需要两个表,因此您需要嵌套它们或使用 reduce。这是一个使用索引的合并:

      >>> pd.merge(pd.merge(t1, t2), t3)
         a  b  c  d
      0  1  5  6  7
      1  2  5  6  7
      2  3  5  6  7
      3  4  5  6  7
      

      这是一个使用'a' 列的合并:

      >>> pd.merge(pd.merge(t1, t2, on='a'), t3, on='a')
         a  b  c  d
      0  1  5  6  7
      1  2  5  6  7
      2  3  5  6  7
      3  4  5  6  7
      

      如果您需要合并不确定数量的数据帧,您可以使用 functools 模块中的reduce 函数和partial 来设置要加入的列(以及您想要的其他参数):

      >>> import functools
      >>> functools.reduce(functools.partial(pd.merge, on='a'), [t1, t2, t3])
         a  b  c  d
      0  1  5  6  7
      1  2  5  6  7
      2  3  5  6  7
      3  4  5  6  7
      

      如果您要处理的数据太大以至于您担心 RAM,那么 csv 是错误的选择。 csv 通常是错误的方法。您至少应该使用 sqlite。使用相同的语言和相同的数据库结构,您可以减少问题、提高可测试性和可维护性,并且总体上让您的生活更轻松。

      【讨论】:

      • 有没有解释为什么 csv 是错误的方法?
      • @Jidder,我添加了更多解释。
      猜你喜欢
      • 2021-02-22
      • 2012-01-02
      • 1970-01-01
      • 2011-07-02
      • 2017-09-08
      • 2021-07-08
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多