Python Pandas合并多个具有相似结构的CSV文件

zzlelutf  于 2023-03-15  发布在  Python
关注(0)|答案(3)|浏览(159)

我已经尝试了这里的所有指令,但就是无法继续。我想使用Pandas从一个文件夹读取所有csv文件,并将它们写入一个 Dataframe 。csv文件几乎都是相同的,但在某些列中,前x行中没有任何内容。但我还是想删除这些行。行数可能会有所不同。整个事情似乎会导致问题,因为csv文件与不同的结构不能被合并.我怎样才能解决这个问题?
为了说明,数据集大致如下所示:

Dataset 1:
0 0 0 0 0 dont need this
0 0 5 0 0 dont need this
3 0 0 1 0 dont need this
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

Dataset 2:
0 0 0 0 0 dont need this
0 0 2 0 0 dont need this
1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

你明白我的意思吗?
这里的每一个指令我都试过了,但都不起作用。

new9mtju

new9mtju1#

import glob

if __name__ == "__main__":
    combined_dataset = []
    for filename in glob.glob("*.csv"):
        with open(filename, "r", encoding="utf-8") as file:
            data = file.read().split("\n")
        data = [elt for elt in data if len(elt.split(",")) == 9]
        combined_dataset.extend(data)

    print(combined_dataset)

我创建了2个csv文件,包含以下内容:
x一个一个一个一个x一个一个二个x
结果是:

['1,2,3,4,5,6,7,8,9', '2,2,3,4,5,6,7,8,9', '3,2,3,4,5,6,7,8,9', '4,2,3,4,5,6,7,8,9', '5,2,3,4,5,6,7,8,9', '6,2,3,4,5,6,7,8,9', '7,2,3,4,5,6,7,8,9', '8,2,3,4,5,6,7,8,9']

这样满意吗?

qltillow

qltillow2#

您可以直接将read csv与panda进行concat:

import pandas as pd
from io import StringIO

dataset1 = StringIO("""0 0 0 0 0
0 0 5 0 0
3 0 0 1 0
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
""")

dataset2 = StringIO("""0 0 0 0 0
0 0 2 0 0
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
""")

dataset_list = [dataset1, dataset2] # your files in a list (use glob to get all csv files for exemple)
cols = [f"col{i}" for i in range(1, 10)] # column names (here we expect 9 columns)

df = pd.concat([
    pd.read_csv(dataset, sep=" ", names=cols) # set separator according to your actual data
    for dataset in dataset_list
    ]
).dropna()

输出:

col1  col2  col3  col4  col5  col6  col7  col8  col9
3     1     2     3     4     5   6.0   7.0   8.0   9.0
4     1     2     3     4     5   6.0   7.0   8.0   9.0
5     1     2     3     4     5   6.0   7.0   8.0   9.0
2     1     2     3     4     5   6.0   7.0   8.0   9.0
3     1     2     3     4     5   6.0   7.0   8.0   9.0
4     1     2     3     4     5   6.0   7.0   8.0   9.0
5     1     2     3     4     5   6.0   7.0   8.0   9.0
6     1     2     3     4     5   6.0   7.0   8.0   9.0
xzlaal3s

xzlaal3s3#

假设您始终具有定义的列数(例如N = 9)和filelist中的csv文件列表,则可以用途:

N = 9
sep= r'\s+' # csv separator (here spaces)

out = pd.concat([pd.read_csv(f, names=range(9), sep=sep).dropna()
                 for f in filelist], ignore_index=True)

相关问题