通过消除冗余行键并使用python

时间:2015-04-25 04:32:50

标签: python pandas

我有以下形式的csv文件:

'userid','metric name (1-10)','value'

列“度量标准名称”具有超过10个不同的度量标准,因此相同的用户标识将具有与之关联的多个行。我想要完成的事情是这样的:

'userid1', 'metric name 1'='value1', 'metric name 2'='value2', 'metric name 3'='value3'... 'metric name 10' = 'value10' 

每个用户标识的单行,其中包含与该用户关联的所有指标和值(k / v对)

我开始使用枢轴,但该功能并没有真正完成我需要它...

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

我认为我需要通过用户对数据集进行迭代,然后获取与该用户关联的指标,并在每次迭代期间构建度量k / v对,然后再转到新用户。我做了一个非常彻底的搜索互联网的工作,但我没有找到我正在寻找的确切内容。如果有一个我可以使用的简单库,请告诉我。

1 个答案:

答案 0 :(得分:0)

这里只有一个使用标准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'

我认为如果需要,我们可以轻松修改此代码以符合您的目标。

希望它有所帮助。 亚瑟。