有没有一种方法可以优化在熊猫中创建连接表?

时间:2020-06-07 23:07:57

标签: python pandas optimization network-programming nested-for-loop

我想使我的代码运行更快。 我刚开始从事数据科学工作并决定做一个项目。 我下载了我国政府向公众提供的有关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")

非常感谢您的帮助!

1 个答案:

答案 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