0

图片描述

对于一个具体的人,知道其性别、有无糖尿病,血压,年龄,胆固醇等,如何在pandas里索引出他的具体值?
至少有6个变量,十分的坑爹
如图,我已经把表格已经被录到Excel中。对于一个具体的人,根据他的性别、有无糖尿病,血压,年龄,胆固醇,是否吸烟来取出对应的风险值。
应该是多重索引。
图片描述

图片描述

icyz 50
2019-02-15 提问
2 个回答
2

我给你举个例子吧, 假设你已经将数据从excel导入且为DataFrame对象
可以使用DataFrame.loc对象来解决(要注意和DataFrame.iloc对象的区别)

>>> index=[4, 5, 6, 7, 8] # 胆固醇
>>> columns=[120, 140, 160, 180] # 血压值
>>> a = pd.DataFrame(index=index, columns=columns, data=np.random.randn(5, 4)) # data是为随机值矩阵
>>> a
        120       140       160       180
4 -1.893583 -1.877188  1.531316  1.468032
5 -0.051771 -0.752350  0.771171 -0.662293
6 -0.252470 -0.084280  0.357515 -0.832810
7  0.112660 -0.559447  0.573227  0.385083
8  1.086797 -1.722506  1.963318  1.362636
>>> # 若某人胆固醇值为8, 血压值为120
>>> d = input('输入胆固醇值:')
输入胆固醇值:8
>>> g = input('输入高血压值:')
输入高血压值:120
>>> a.loc[d, g]
1.0867967045350686
1

终于弄好了

import pandas as pd
import numpy as np
df=open('C:/Users/xxxxxxx/风险评估表.xlsx','rb') #'rb'为了避免打不开
df=pd.read_excel(df)
#print(df.head())
dt=open('C:/Users/xxxxxxx/new_file.csv','rb') #为了避免打开乱码
dt=pd.read_csv(dt)
prs=lambda x:120 if x<140 else (140 if x<160 else (160 if x<180 else 180))
age=lambda x:40 if x<50 else (50 if x<60 else (60 if x<70 else 70))
dgc=lambda x:4 if x<5 else (5 if x<6 else (6 if x<7 else (7 if x<8 else 8)))
ndt = pd.DataFrame() #创建一个空的dataframe
for i in range(1,len(dt)): #循环数据框次
    fx=df[(df['性别']==dt.iloc[i,:][1])&(df['年龄组']==age(dt.iloc[i,:][2]))&(df['吸烟']==dt.iloc[i,:][9])&(df['糖尿病']==dt.iloc[i,:][10])&(df['胆固醇']==dgc(dt.iloc[i,:][17]))]
    rsk=fx[prs(dt.iloc[i,:][22])]
    v=dt.iloc[i,:].copy() #直接读取一列为数据框架的镜像,为了克服镜像不能添加新列的错误添加.copy()
    for x in rsk:
        v['风险']=x
        ndt=ndt.append(v) #切记重新赋值,否则添加不成功
        print('风险评估任务已完成:%.2f %%' %(i/len(dt)*100))
ndt.to_csv('file.csv',encoding='utf_8_sig') #为了避免保存新文件乱码

撰写答案

推广链接