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

2024-06-28 14:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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个文件可能需要很长时间。你知道吗


Tags: columns文件keyoutputnullm5valuesm4
1条回答
网友
1楼 · 发布于 2024-06-28 14:24:02

有点不清楚你的格式是什么,但我认为这会起作用:

 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。你知道吗

我不认为这需要“永远”;一千个文件最坏也需要几分钟,除非你有大量的度量标准。你知道吗

你也可以这样做:

 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()这将创建一个数据帧,其中每个条目是具有相同键的所有行的最大度量。所以,同样,如果每个(键、度量)组合只有一个值,这应该会给出您想要的。如果有多个值,除最大值外,所有值都将被忽略。你知道吗

相关问题 更多 >