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

2024-09-27 07:24:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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对,然后再继续访问新用户。我做了一个相当彻底的工作,搜索互联网,但我没有找到确切的我要找的。请告诉我是否有一个简单的图书馆,我可以使用。你知道吗


Tags: 文件csv用户namedata度量value格式
1条回答
网友
1楼 · 发布于 2024-09-27 07:24:37

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

我认为这个代码可以很容易地修改,以符合您的目标,如果需要的话。你知道吗

希望有帮助。 亚瑟。你知道吗

相关问题 更多 >

    热门问题