Pandas拆分数据不一致的列和不一致的列

Pandas split column with inconsistent data and inconsistent columns

我在 pandas 方面需要一些帮助,我正在尝试清理 csv 文件。我有三种类型的 CSV

  1. 正确且符合预期的 csv
0 1 2 3 4
100 200 300 400 500
  1. 类型一丛生
0 1 2 3 4
100 200 300 400 NaN 500
  1. 类型二丛集
0 1 2 3
100 200 300 400 500 NaN

我正在尝试更正 csv 2 和 3,使其变得像 csv 1

代码

import glob
import pandas as pd


dir = r'D:\csv_files'

file_list = glob.glob(dir +'/*.csv')
files = []
for filename in file_list:
    df = pd.read_csv(filename, header=None)
    split = df.pop(2).str.split(' ', expand=True)
    df.join(split, how='right', lsuffix = '_left', rsuffix = '_right')
    print(df)

输出:

  0    1   2   3   4
0 100 200 300 400 500

  0    1   3   4
0 100 200 NaN 500

  0    3
0 100 NaN

目标:

   0   1   2   3   4
0 100 200 300 400 500

   0   1   2   3   4
0 100 200 300 400 500

   0   1   2   3   4
0 100 200 300 400 500

我打印了 split,它是正确的,但是,我找不到如何将它放回主数据框中的方法。

提前致谢

您可能会发现使用标准 Python csv.reader() 更容易 pre-parse 数据。这可用于拆分任何 'clumped' 值,然后将它们展平成一个列表。

例如:

import pandas as pd    
from itertools import chain
import glob
import csv

data = []

for fn in glob.glob('rate*.csv'):
    with open(fn) as f_input:
        csv_input = csv.reader(f_input)
        
        for row in csv_input:
            values = chain.from_iterable(value.split(' ') for value in row[2:] if value)
            data.append([row[0], row[1], *values])

df = pd.DataFrame(data, columns=range(6))
print(df)

这会给你一个数据框开始:

                         0                                  1     2     3     4     5
0               Montserrat                            Manzini     6     6     5     6
1               Madagascar                           San Juan    10     4     9     8
2                 Botswana                             Tehran     2    10     9    10
3     Syrian Arab Republic                          Fairbanks     2     4     9     2
4                   Guinea                       Punta Arenas     5     1     6     3