在Python中组合异构csv文件的最快/最有效的方法

时间:2018-01-31 16:14:26

标签: python csv

我有1000个csv文件,大小从8MB到17MB不等。每个文件都有6个指标的一部分。示例如下:

File1 (columns): key, metric1, metric2, metric3
File1 (values):  k1, m1, m2, m3
File2 (columns): key, metric4, metric5, metric6
File2 (values):  k1, m4, m5, m6
File3 (columns): key, metric2, metric4, metric5, metric6
File3 (values):  k2, m2, m4, m5, m6

我今天尝试的所有方法都将文件合并到下面的输出中:

Output (columns): key, metric1, metric2, metric3, metric4, metric5, metric6
Output (values):  key1, m1,   m2,   m3,   null, null, null
                  key1, null, null, null, m4,   m5,   m6
                  key2, null, m2,   null, m4,   m5,   m6

我真正需要的是按键列合并行:

Output (columns): key, metric1, metric2, metric3, metric4, metric5, metric6
Output (values):  key1, m1,   m2, m3,   m4, m5, m6
                  key2, null, m2, null, m4, m5, m6

我知道pandas可以做到;但是,完成1000个文件可能需要很长时间。

1 个答案:

答案 0 :(得分:0)

您的格式有点不清楚,但我认为这样可行:

 df = pd.DataFrame(expected_metrics)
 for filename in filelist:
       current_data = pd.read_csv(filename,index_col = 'key')
       current_columns = current_data.columns
       current_row = current_data.index[0] 
       df.loc[current_row,current_columns] = current_data

注意:

- 这要求您提前知道会出现哪些指标,以便初始化expected_metrics。您可以使用以下代码替换最后一行:

 for column in current_columns:
      df.loc[current_row,column] = current_data[column]

这可能需要更长的时间

- 如果特定(密钥,指标)组合出现多次,则仅记录最后一个。

- 结果将key作为索引。如果您希望将其作为数据列,则必须执行df['key'] = df.index

我不希望这会花费很长时间&#34 ;;除非你有非常多的指标,否则一千个文件应该在最差的几分钟内完成。

你也可以这样做:

 data = {}
 for filename in filelist:
       current_data = pd.read_csv(filename,index_col = 'key')
       current_columns = current_data.columns
       current_row = current_data.index[0] 
       data[current_row] = {column:list(current_data[column])[0] for column in current_columns}

这将给出一个字典,其中每个键都是数据中的键,值是表示该键行的字典。

编辑: 第三种选择是获取您已有的输出并执行df.groupby(by='key').max()这将创建一个数据框,其中每个条目是具有相同键的所有行的最大度量。所以,再次,如果每个(键,公制)组合只有一个值,这应该给你你想要的。如果您有多个值,则忽略除最大值之外的所有值。