通过使用python消除冗余行键和合并字段来重塑csv

通过使用python消除冗余行键和合并字段来重塑csv,python,pandas,Python,Pandas,我有一个csv文件,格式如下: 'userid','metric name (1-10)','value' “metric name”列有10个以上的不同度量,因此同一个userid将有多行与其关联。我想要完成的是这样的事情: 'userid1', 'metric name 1'='value1', 'metric name 2'='value2', 'metric name 3'='value3'... 'metric name 10' = 'value10' 每个userid的一行,其

我有一个csv文件,格式如下:

'userid','metric name (1-10)','value'
“metric name”列有10个以上的不同度量,因此同一个userid将有多行与其关联。我想要完成的是这样的事情:

'userid1', 'metric name 1'='value1', 'metric name 2'='value2', 'metric name 3'='value3'... 'metric name 10' = 'value10' 
每个userid的一行,其中包含与该用户关联的所有度量和值(k/v对)

我开始使用pivot,但该功能并不能真正满足我的需要

import pandas as pd
data=pd.read_csv('bps.csv')
data.pivot('entityName', 'metricName', 'value').stack()

我认为我需要按用户对数据集进行迭代,然后获取与该用户相关联的度量,并在每次迭代中构建度量k/v对,然后再转到新用户。我在互联网上搜索得非常彻底,但没有找到我想要的东西。请让我知道是否有一个简单的图书馆,我可以使用

这里提供了一个仅使用标准python而非任何框架的解决方案

从以下数据文件开始:

id1,name,foo
id1,age,10
id2,name,bar
id2,class,example
id1,aim,demonstrate
您可以执行以下代码:

separator = ","
userIDKey = "userID"
defaultValue = "No data"

data = {}
#collect the data
with open("data.csv", 'r') as dataFile:
    for line in dataFile:
        #remove end of line character
        line = line.replace("\n", "")

        userID, fieldName, value = line.split(separator)

        if not userID in data.keys():
            data[userID] = {userIDKey:userID}

        data[userID][fieldName] = value

#retrieve all the columns header in use
columnsHeaders = set()
for key in data:
    dataset = data[key]
    for datasetKey in dataset :
        columnsHeaders.add(datasetKey)

columnsHeaders.remove(userIDKey)
columnsHeaders = list(columnsHeaders)
columnsHeaders.sort()

def getValue(key, dic):
    if key in dic.keys():
        return dic[key]
    else:
        return defaultValue

#then export the result
with open("output.csv", 'w') as outputFile:
    #export first line of header
    outputFile.write(userIDKey)
    for header in columnsHeaders:
        outputFile.write(", {0}".format(header))
    outputFile.write("\n")
    #and export each line
    for key in data:
        dataset = data[key]
        outputFile.write(dataset[userIDKey])
        for header in columnsHeaders:
            outputFile.write(", {0}".format(getValue(header, dataset)))
        outputFile.write("\n")
然后得到以下结果:

userID, age, aim, class, name
id1, 'age'='10', 'aim'='demonstrate', 'class'='No data', 'name'='foo'
id2, 'age'='No data', 'aim'='No data', 'class'='example', 'name'='bar'
我认为,如果需要的话,可以很容易地修改此代码以匹配您的目标

希望能有帮助。
Arthur.

您的示例所需结果不再有效。