我有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个文件可能需要很长时间。
答案 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()
这将创建一个数据框,其中每个条目是具有相同键的所有行的最大度量。所以,再次,如果每个(键,公制)组合只有一个值,这应该给你你想要的。如果您有多个值,则忽略除最大值之外的所有值。