gpt4 book ai didi

python / Pandas : Convert multiple CSV files to have union and ordered header and fill the missing data

转载 作者:行者123 更新时间:2023-12-04 04:00:28 24 4
gpt4 key购买 nike

我在一个包含奇数列的文件夹中有 36 个 CSV 文件(每个文件中的列数范围从 90 到 255)。在单个 CSV 文件中,最大行数为 300,但是,列可以有 0 到 300 行。 CSV 文件示例如下:

Row  col1 col2 col3 ........................ col200
1 2 3 4 ......................... 25
2 1 8 .......................... 0.2
3 5 2 ........................... 5
. . . .......................... .
. . . ........................... .
. . . ........................... .
. . . ........................... .
. . . ........................... .
. . . ........................... .
300 3 12 .......................... 1

我想使用 Python 转换这些 CSV 文件以获取以下属性:

  1. 所有转换后的 CSV 文件必须具有相同的列(相同的顺序和大小)。这些列是所有原始 CSV 文件中的列(非重复)的并集。

  2. 转换后的 CSV 文件的列必须按顺序排列。即 c1.csv3rd column 也必须是其他剩余 CSV 文件的 3rd column

  3. 如果任何原始 CSV 文件中缺少任何联合列,则转换后的 CSV 文件将在行中添加缺少的列和默认值(所有 300 行中的固定值)。

  4. 如果联合列和原始 CSV 文件中都存在任何列:

    (a) 如果这一列的行数是300,照原样复制。

    (b) 如果此列中的行数少于 300,则用此行中可用值的平均值填充剩余行。

为了实现上述特性,我用python编写了如下代码:

import pandas as pd
import csv
import glob
import os

path = r'FILE PATH TO ORIGINAL FILES' # file path to original files
all_files = glob.glob(path + "/*.csv")
combined_csv = pd.concat([pd.read_csv(f) for f in all_files]) #To get common columns
master_set =list(combined_csv.columns)

for file in all_files:
filtered_df = pd.read_csv(file)
for cols in master_set:
if(cols in filtered_df):
if(filtered_df[cols].count()>300): pass
elif (filtered_df[cols].count()<300):
total = sum(value for value in filtered_df[cols])
avg = total/filtered_df[cols].count()
i = filtered_df[cols].count()
while i<301:
filtered_df.at[i,cols] = avg
i+=1
else:
filtered_df[cols] = 10

file_name = os.path.split(file)[-1] #Select individual file (eg. c1.csv)
file_name_path = os.path.join('FILE PATH TO CONVERTED FILES' + file_name)
filtered_df.to_csv(file_name_path)

运行上面的代码后,我得到了 36 个转换后的 CSV 文件,其中包含一组通用的列。添加的列(在联合列中但不在单个文件中的列)中的行用默认值填充。但是,上面的代码仍然没有满足以下属性。

  1. 新创建的 CSV 文件中的列顺序不匹配。
  2. 未实现上述特性 4(b)。即,原始文件中出现在联合列中但值少于 300 个(行 <300)的任何列都不会被插值填充。

我将更新/编辑我的问题以进一步阐明。

任何帮助,请!

最佳答案

我用以下方法解决了我的问题:

import pandas as pd
import csv
import glob
import os

path = r'FILE PATH TO ORIGINAL FILES' # file path to original files
all_files = glob.glob(path + "/*.csv")
combined_csv = pd.concat([pd.read_csv(f) for f in all_files]) #To get common columns
master_set =list(combined_csv.columns)

for file in all_files:
filtered_df = pd.read_csv(file)
for cols in master_set:
if(cols in filtered_df):
total = 0
if(filtered_df[cols].count()>300): pass
elif (filtered_df[cols].count()<300):
for value in filtered_df[cols]:
if(math.isnan(value) == False):
total = total + value
avg = total/filtered_df[cols].count()
i = filtered_df[cols].count()
while i<301:
filtered_df.at[i,cols] = avg
i+=1
else:
filtered_df[cols] = 10

filtered_df = filtered_df[master_set]
file_name = os.path.split(file)[-1] #Select individual file (eg. c1.csv)
file_name_path = os.path.join('FILE PATH TO CONVERTED FILES' + file_name)
filtered_df.to_csv(file_name_path)

为了实现 (1),我用 filtered_df = filtered_df[master_set] 更新了代码。对于 4(b),我将原始代码更新为 if(math.isnan(value) == False)

关于 python / Pandas : Convert multiple CSV files to have union and ordered header and fill the missing data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63112465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com