0

我想让我的代码运行得更快。我刚刚开始研究数据科学并决定做一个项目。我下载了我们政府向公众提供的关于我国 Covid-19 死亡的信息,并从中制作了一个 csv 文件。它的结构如下所示:
table1

我将这张表格式化为更易于管理。

这是我最终使用的结构: table2

从表一中可以看出,每个人都患有多种疾病,我很好奇它们之间的“联系程度”,所以我创建了table3

我们将所有独特的疾病作为列(在本例中超过 500 列),每一行代表一种独特的疾病。所以我们最终会得到一个 500X500 的表。所以说了这么多,让我们来回答我的问题:我怎样才能让我的代码,这将导致table3比现在更优化,因为它需要太多时间来编译(大约 240 秒,有 500 个唯一疾病)。这是我的代码:

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")

非常感谢您的帮助!

4

1 回答 1

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
于 2020-06-08T01:52:19.907 回答