我想使我的代码运行更快。
我刚开始从事数据科学工作并决定做一个项目。
我下载了我国政府向公众提供的有关Covid-19死亡的信息,并制作了一个csv文件。
它的结构如下所示:
table1
我将该表格的格式设置为更易于管理。
这是我最终要使用的结构:table2
因此,从表1中可以看出,每个人都有多种疾病,我很好奇他们之间的“联系”,因此我创建了table3。
我们有所有独特疾病的列(在这种情况下,超过500列),每一行代表一种独特疾病。这样我们最终得到一个500X500的表格。 所以说了这么多,让我们开始我的问题: 我该如何使代码table3比现在更优化,因为编译它花了太多时间(500种独特疾病大约需要240秒)。 这是我的代码:
import pandas as pd
from operator import add
import time
start_time = time.time()
#Columns:Id,Disease,Gender,Age
df=pd.read_csv('table2.csv')
headers=df.groupby('Disease').size().to_frame('size').reset_index().sort_values(['size'],ascending=[False])
headers=headers[headers['size']>10].Disease.unique()
network=pd.DataFrame(columns=headers)
for i in range(len(headers)):
temp_1=df[df.Disease == headers[i]]
ids=temp_1.Id.unique()
lista=[0]*len(headers)
for j in range(len(ids)):
temp_2=df[df.Id == ids[j]]
temp_2=temp_2[temp_2.Disease != headers[i]]
temp_lista=[]
for k in range(len(headers)):
temp_3=temp_2[temp_2.Disease == headers[k]]
temp_lista.append(len(temp_3))
lista=list(map(add,lista,temp_lista))
network.loc[i]=lista
network.insert(0,'Diseases',headers)
network.to_csv('table3.csv')
print ("My program took", time.time() - start_time, "to run")
非常感谢您的帮助!
答案 0 :(得分:0)
1。示例数据;
import pandas
df1 = pandas.DataFrame({
'Id' : [1, 2, 3],
'Diseases' : [['D1', 'D2', 'D3'], ['D2', 'D4', 'D5'], ['D1', 'D2', 'D5']],
'Age' : [90, 60, 70],
'Gender': ['Male', 'Female', 'Female']
})
df1
输出:
Id Diseases Age Gender
0 1 [D1, D2, D3] 90 Male
1 2 [D2, D4, D5] 60 Female
2 3 [D1, D2, D5] 70 Female
2。创建表2;
df2 = (df1.join(df1['Diseases'].apply(pandas.Series))
.drop('Diseases', axis=1))
df2 = ( df2.set_index(['Id', 'Age', 'Gender'])
.stack().reset_index().drop('level_3', axis=1)
.rename(columns={0: 'Diseases'})
)
df2
输出:
Id Age Gender Diseases
0 1 90 Male D1
1 1 90 Male D2
2 1 90 Male D3
3 2 60 Female D2
4 2 60 Female D4
5 2 60 Female D5
6 3 70 Female D1
7 3 70 Female D2
8 3 70 Female D5
3。这是您要找的吗?
我不太了解您要在这里做什么。
df3.pivot_table(index=df3.Diseases, columns='Diseases', values='Id', aggfunc='count')
输出;
Diseases D1 D2 D3 D4 D5
Diseases
D1 2.0 NaN NaN NaN NaN
D2 NaN 3.0 NaN NaN NaN
D3 NaN NaN 1.0 NaN NaN
D4 NaN NaN NaN 1.0 NaN
D5 NaN NaN NaN NaN 2.0