连接具有相同索引/ col的多个表的最有效方法是什么?

时间:2014-12-01 20:09:01

标签: python bash awk sed pandas

我有多个这样的表保存在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数据帧的最佳方法是什么? “最好”,我的意思是保持ram低,并希望利用某种并行计算。

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

3 个答案:

答案 0 :(得分: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')

答案 1 :(得分:1)

如果没有发布一些具体的输入和预期的输出,很难说,但听起来像UNIX实用程序join就是你想要的。

答案 2 :(得分:1)

如果要在磁盘上保留大量数据,csv是错误的方法,没有标准,唯一的数据类型是字符。 csv的用例是当你有一小部分你想要注意的数据时,你是唯一一个需要访问数据的人,所以缺乏标准就是没有。大问题。但即使它只适合您,如果您稍后再回到您的数据,您会记住您使用的所有规范以及编码数据的条件吗?对于相当小的数据集,它不是一个问题,因为您可以直观地检查整个事物。对于较大的数据集,您应该使用sqlite或更长的关系数据库来保存数据。

  

Q值。 "使用相同索引/列连接多个表的最有效方法是什么?"

我认为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。使用相同的语言和相同的数据库结构保持一切,您可以减少问题,提高可测试性和可维护性,并使您的生活更加轻松。