通过使用python消除冗余行键和合并字段来重塑csv
我有一个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的一行,其
'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.您的示例所需结果不再有效。