[英]Creating a dictionary using data from a .csv file
我有一個20行的.csv文件,每行格式如下:
Lucy, 23, F, diabetes
Darwin, 60, M, hypertension
Dave, 35, M, epilepsy
Tiffany, 12, F, asthma
... 等等。
我希望將 this.csv 文件轉換為字典,如下所示:
dict = {
'Lucy':{
age: 23
gender: 'F'
condition: 'diabetes'
},
'Darwin':{
age: 60
gender: 'M'
condition: 'hypertension'
},
#(and so on for all 20 lines)
}
每一行的格式為:姓名、年齡、性別、狀況。 這是我到目前為止所嘗試的。
dict ={}
f = open("medical.csv', mode = "rt", encoding = "utf8")
s = f.readline()
for line in f:
line.split(",")
...這就是我停下來的地方。 我無法弄清楚如何將標題分配給該行中的每個值,以便字典將如上顯示,帶有標簽“年齡”、“性別”和“條件”。 當我運行代碼時,“ medical.csv
”上有一個SyntaxError: invalid syntax
消息。
年齡必須是 integer。 如果不是 integer,我希望程序在創建字典時跳過該行。
任何幫助將非常感激!
我建議不要用名稱命名字典鍵,因為名稱可以重復。
首先創建主字典,然后遍歷 CSV 中的行。 在每一行中提取名稱人員屬性(您使用了 split 方法 - 它非常適合這里,但不要使用 split( split(",")
使用split(", "))
。 為每個人創建字典並以這種方式為其分配鍵和值:
person = {}
person['age'] = 23
以此類推...然后將這個人的字典作為值分配給主字典,並將鍵設置為人名。 希望它有點幫助!
首先,請記住,您的問題可能有更多“pythonic”答案。
好吧,您走在正確的道路上:
dict ={}
f = open("medical.csv", mode = "rt", encoding = "utf8")
s = f.readline()
for line in f:
l = line.split(",")
讓我們為line.split(",")
( l
) 的結果命名。 現在l
是這種格式:
l[0]
包含姓名l[1]
包含年齡l[2]
包含性別l[3]
包含條件。
現在, l
的第一個元素是名稱,所以讓我們將它添加到字典中:
dict[l[0].strip()] = {}
筆記:
l[0].strip()
因為它的開頭或結尾可能有不需要的空格現在,讓我們依次添加其他字段:
dict[l[0].strip()]['gender'] = l[2].strip()
dict[l[0].strip()]['condition'] = l[3].strip()
這有效,除非年齡不是 integer,所以我們需要事先使用 try except 塊:
try:
age = int(l[1].strip())
except ValueError:
continue # You want to skip the current iteration, right?
現在我們可以把所有東西放在一起,稍微潤色一下代碼:
dict ={}
f = open("medical.csv", mode = "rt", encoding = "utf8")
s = f.readline()
for line in f:
l = line.split(",")
age = -1
try:
age = int(l[1].strip())
except ValueError:
continue
key = l[0].strip()
dict[key]['age'] = age
dict[key]['sex'] = l[2].strip()
dict[key]['condition'] = l[3].strip()
當然,這假設所有的名字都是不同的(我剛剛閱讀了 firanek 的回答:我同意她/他的觀點,即你不應該使用名字作為密鑰,使用這種方法,你會丟失關於所有人的所有數據除了最后一個名字相同)
哦,我差點忘記了:您可以使用dict
構造函數並替換行dict[keys][<string>] = <thing>
: dict[key] = {'age' = age, 'sex' = l[2].strip(), 'condition' = l[3].strip()
。
為此,我建議使用csv
模塊。 請注意方便的skipinitialspace
參數。
import csv
from pprint import pprint
def row_to_dict(ts):
return {k: t for k, t in zip(("age", "gender", "condition"), ts)}
if __name__ == "__main__":
result = {}
with open("medical.csv") as f:
reader = csv.reader(f, skipinitialspace=True)
for row in reader:
name, data = row[0], row[1:]
result[name] = row_to_dict(data)
pprint(result)
您可能想查看Pandas庫,並使用 DataFrames 操作數據,因為它具有許多內置功能。
import pandas as pd
data=pd.read_csv("data.csv", header=None ,names=["Name", "Age", "Gender", "Condition"], index_col=False, na_values=",NaN, null", verbose=True)
data=pd.DataFrame(data)
newdata=data.dropna(subset=['Age'])
print("new data: \n", newdata)
還有一個類似的問題: Pandas: drop columns with all NaN's
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.