我有多个这样的表保存在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的加权和。我有两件我想的一般事情:
使用这些列创建pandas数据帧的最佳方法是什么? “最好”,我的意思是保持ram低,并希望利用某种并行计算。
我想在磁盘上保留这个数据帧,所以我想也许有更好的方法使用命令行工具,比如sed / awk / cut来获取csv,然后我就可以加载了。有什么提示吗?
答案 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。使用相同的语言和相同的数据库结构保持一切,您可以减少问题,提高可测试性和可维护性,并使您的生活更加轻松。