Pandas拆分数据不一致的列和不一致的列
Pandas split column with inconsistent data and inconsistent columns
我在 pandas 方面需要一些帮助,我正在尝试清理 csv 文件。我有三种类型的 CSV
- 正确且符合预期的 csv
0
1
2
3
4
100
200
300
400
500
- 类型一丛生
0
1
2
3
4
100
200
300 400
NaN
500
- 类型二丛集
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
我在 pandas 方面需要一些帮助,我正在尝试清理 csv 文件。我有三种类型的 CSV
- 正确且符合预期的 csv
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
100 | 200 | 300 | 400 | 500 |
- 类型一丛生
0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
100 | 200 | 300 400 | NaN | 500 |
- 类型二丛集
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