我有一个类似于下面这个例子的CSV文件,我在尝试将其读入python时遇到了麻烦。该文件来自X射线阅读器。每次使用时都会创建迷你表,并将它们分组为一个CSV。
问题是每个迷你表可以来自两种不同的方法,并且具有不同数量的标题。
ID Method a1 a2 a3 a4 a6 a7 a8 a9
01 Soil 2 3 4 5 3 6 4 8
02 Soil 6 9 2 7 4 3 4 4
03 Soil 5 2 4 9 1 1 2 3
ID Method a1 a5 a6 a7
01 Datas 5 4 7 8
02 Datas 4 6 3 8
03 Datas 6 3 2 8
ID Method a1 a5 a6 a7 a8 a9 a10 a11
01 Soil 5 4 7 8 2 1 3 4
02 Soil 4 6 3 8 7 2 2 1
ID Method a1 a5 a6 a7 a8 a9
01 Datas 5 4 7 8 2 1
02 Datas 4 6 3 8 7 2
03 Datas 6 3 2 8 9 9
03 Datas 5 3 2 2 7 7
我的目标是将这个混乱的CSV文件拆分为两个新的CSV,具体取决于"方法"列,仅包含一个标题。必要时填写0。类似的东西:
ID Method a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11
01 Soil 2 3 4 5 0 3 6 4 8 0 0
02 Soil 6 9 2 7 0 4 3 4 4 0 0
03 Soil 5 2 4 9 0 1 1 2 3 0 0
01 Soil 5 0 0 0 4 7 8 2 1 3 4
02 Soil 4 0 0 0 6 3 8 7 2 2 1
非常欢迎任何有关如何解决此问题的帮助或想法!我真的迷失了如何解决这个问题。
原文与此类似:
提前致谢!
答案 0 :(得分:2)
您可以将pandas
与collections.defaultdict
一起使用。
最好将字典用于可变数量的变量。
<强>解决方案强>
from collections import defaultdict
# initialise defaultdict of lists
d = defaultdict(list)
# iterate list of dictionaries and append to appropriate value
for item in [df1, df2, df3]:
d[item['Method'].iloc[0]].append(item)
# convert to integer
def formatter(df):
df.iloc[:, 2:] = df.iloc[:, 2:].apply(pd.to_numeric, downcast='integer')
return df
# use dictionary comprehension to process results for each Method
res = {k: formatter(pd.concat(v).fillna(0)) for k, v in d.items()}
print(res['Soil'])
ID Method a1 a10 a11 a2 a3 a4 a5 a6 a7 a8 a9
0 1 Soil 2 0 0 3 4 5 0 3 6 4 8
1 2 Soil 6 0 0 9 2 7 0 4 3 4 4
2 3 Soil 5 0 0 2 4 9 0 1 1 2 3
0 1 Soil 5 3 4 0 0 0 4 7 8 2 1
1 2 Soil 4 2 1 0 0 0 6 3 8 7 2
<强>设置强>
您可以使用file1.csv
,file2.csv
等替换字符串
from io import StringIO
df1_str = StringIO("""ID Method a1 a2 a3 a4 a6 a7 a8 a9
01 Soil 2 3 4 5 3 6 4 8
02 Soil 6 9 2 7 4 3 4 4
03 Soil 5 2 4 9 1 1 2 3""")
df2_str = StringIO("""ID Method a1 a5 a6 a7
01 Datas 5 4 7 8
02 Datas 4 6 3 8
03 Datas 6 3 2 8""")
df2_str = StringIO("""ID Method a1 a5 a6 a7 a8 a9 a10 a11
01 Soil 5 4 7 8 2 1 3 4
02 Soil 4 6 3 8 7 2 2 1""")
df3_str = StringIO("""ID Method a1 a5 a6 a7 a8 a9
01 Datas 5 4 7 8 2 1
02 Datas 4 6 3 8 7 2
03 Datas 6 3 2 8 9 9
03 Datas 5 3 2 2 7 7""")
df1 = pd.read_csv(df1_str, delim_whitespace=True)
df2 = pd.read_csv(df2_str, delim_whitespace=True)
df3 = pd.read_csv(df3_str, delim_whitespace=True)
答案 1 :(得分:1)
我们可以逐行处理文件
import pandas as pd
data = []
with open('pxrf.csv', 'r') as f:
for s in f.readlines():
s = s.strip()
if not s: # empty line
header = None
continue
if s.startswith('File #'): # Header line
header = s.split(',')
else: # Content line
data.append(dict(zip(header, s.split(','))))
df = pd.DataFrame(data).fillna('0')
您可能需要更改某些列的数据类型。