使用 python 将 csv 文件从垂直数据转换为水平数据



我正在开发一个python脚本。我的大部分数据都记录在垂直模型中,我希望将它们记录在水平模型中。

这是我的数据示例

ID,Identifier,Value
1_UK,City,Paris
1_UK,Number of the departments,75
1_UK,Department,Ile de France
1_UK,Habitant,12405426hab
2_UK,City,Ajaccio
2_UK,Number of the departments,2A
2_UK,Department,Corse du Sud

这就是我想去的地方:

ID, City, Number of the departments, Department, Habitant
1_UK, Paris, 75, Ile de France, 12405426hab
2_UK, Ajaccio, 2A, Corse du sud,''

在Python中读取CSV文件并不困难。我迷路的地方是我有4个标识符(城市,部门编号,部门和居民(ID 2_UK没有居民的值。我不知道如何在我的代码中表示它。

import csv
csvfile = open ("Exercice1.csv",'r',encoding='utf-8')
IDs=[]
identifiers=[]
uniqueIDs=[]
uniqueidentifiers=[]
reader=csv.reader(csvfile)
for row in reader:    
    IDs.append(ID)
    identifiers.append(identifier)
csvfile.close()
#remove duplicate value and keep order as is it.
for i in IDs:
    if i not in uniqueIDs:
        uniqueIDs.append(i)
for i in identifiers:
    if i not in uniqueidentifiers:
        uniqueidentifiers.append(i)

然后我迷路了函数zip似乎不能满足我的需求,或者我没有正确使用它。

很高兴听取您的建议。

谢谢!

使用 pandas 很容易。可以将.csv文件导入到数据帧df,然后使用 pivot

In [10]: d = df.pivot(index='ID', columns='Identifier', values='Value')
In [11]: d
Out[11]: 
Identifier     City     Department     Habitant Number of the departments
ID                                                                       
1_UK          Paris  Ile de France  12405426hab                        75
2_UK        Ajaccio   Corse du Sud         None                        2A

你可以做一些类似的事情:

import csv
cities = {}
with open('Exercice1.csv', 'r') as f:
    reader = csv.DictReader(f)
    for d in reader:
        new_dict = {d['Identifier']: d['Value'], 'ID': d['ID']}
        try:
            cities[d['ID']] = {**cities[d['ID']], **new_dict}
        except KeyError:
            cities[d['ID']] = {**new_dict}
with open('output.csv', 'w') as f:
    field_names = ['ID', 'City', 'Number of the departments', 'Department', 'Habitant']
    writer = csv.DictWriter(f, fieldnames=field_names, lineterminator='n', restval='')
    writer.writeheader()
    for k, v in cities.items():
        writer.writerow(v)

使用您的数据,这给了我:

ID,City,Number of the departments,Department,Habitant
1_UK,Paris,75,Ile de France,12405426hab
2_UK,Ajaccio,2A,Corse du Sud,

csv.DictWriter 中的restval参数是提供的字典没有field_names列表中的键时插入行中的内容。我只是用了一个空字符串,你可以用你喜欢的任何内容替换它。

最新更新