长期吃咸菜可引发心脑血管病

本文探讨了传统早餐配菜咸菜和腐乳的营养价值。咸菜能调节胃口、增强食欲,但维生素C损失严重且含有潜在致癌物亚硝酸盐;相比之下,腐乳不仅保留了豆制品的高蛋白和丰富钙质,还通过发酵产生了多种有益健康的低聚肽类。然而,二者均为高盐食品,不宜过量食用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在的早餐,早已不是以往豆浆、油条、咸菜的老三样,从广式早餐到上海馄饨,少说也有上百种。但有人却一直怀念“吃糠咽菜”的日子,一碗粥加点咸菜腐乳,一样有滋有味。不过,虽说咸菜和腐乳都是用来“提味”的,但它们的营养差的还真是十万八千里。

    吃咸菜可以调节胃口、增强食欲、补充膳食纤维,但其中的健康隐患也不少。新鲜蔬菜在腌制时,所含的维生素C几乎会“全军覆灭”,因而腌咸菜的营养价值远比鲜菜要低。更严重的是,咸菜中含有较多亚硝酸盐,进入人体后会生成致癌物亚硝胺,让人吃时总有后顾之忧。

    比起咸菜来,腐乳的营养价值则高了许多。腐乳的原料———豆腐干,是营养价值很高的豆制品,蛋白质含量达15%—20%,与肉类相当,同时含有丰富的钙质。腐乳在制作过程中经过了发酵,从而生成大量的低聚肽类,具有抗衰老、防癌症、降血脂、调节胰岛素等多种生理保健功能,对身体健康十分有利。发酵也使蛋白质的消化吸收率更高,维生素含量更丰富。在发酵过程中,因为微生物分解了豆类中的植酸,使得大豆中原本吸收率很低的铁、锌等矿物质更容易被人体吸收。

    虽然从营养的角度讲,腐乳的价值要高于咸菜,但两者同属于高盐食品,不宜多吃和长期食用,否则会易引起心脑血管疾病和骨质疏松。在日常生活中,最好控制每天最多吃20克咸菜或一块腐乳。如果有条件的话,最好选择那些低盐的产品。

改进下面的代码,有部分数据出来填充是异常值: columns = [ '是否大米', '平均每次食用量', '是否小麦面粉', '平均每次食用量.1', '是否杂粮', '平均每次食用量.2', '是否薯类', '平均每次食用量.3', '是否油炸面食','平均每次食用量.4', '是否猪肉','平均每次食用量.5', '是否牛羊肉','平均每次食用量.6', '是否禽肉','平均每次食用量.7', '是否内脏类','平均每次食用量.8', '是否水产类','平均每次食用量.9', '是否鲜奶','平均每次食用量.10', '是否奶粉','平均每次食用量.11', '是否酸奶','平均每次食用量.12', '是否蛋类','平均每次食用量.13', '是否豆腐','平均每次食用量.14', '是否豆腐丝等','平均每次食用量.15', '是否豆浆','平均每次食用量.16', '是否干豆','平均每次食用量.17', '是否新鲜蔬','平均每次食用量.18', '是否海草类','平均每次食用量.19', '是否咸菜','平均每次食用量.20', '是否','平均每次食用量.21', '是否','平均每次食用量.22', '是否糕点','平均每次食用量.23', '是否水果','平均每次食用量.24', '是否果汁饮料','平均每次食用量.25', '是否其他饮料', '平均每次食用量.26' ] medians = {col: df_cleanID[col].median() for col in columns} # 打印结果 (如果需要) for key, value in medians.items(): print(f"{key}: {value}") df_cleanID = df_cleanID.fillna(medians)
03-30
<think>嗯,用户给了一段Python代码,用来处理数据中的缺失值,用中位数填充。但发现填充后的数据有异常值。需要改进代码,解决这个问题。首先,我要理解用户的数据结构。columns列表里有很多“是否某类食物”和对应的“平均每次食用量”字段。比如“是否大米”和“平均每次食用量”,可能者是布尔型或0/1,后者是数值型。 用户用中位数填充缺失值,但结果出现异常。可能的原因是什么呢?首先,是否应该根据“是否”来有条件填充?比如,如果某人没有大米,那么对应的食用量应该是0,而不是中位数。如果直接填充中位数,那些本来没的人会被错误地赋予一个食用量,导致异常值。 所以,正确的做法应该是,对于每个食物的食用量,只有当“是否”为是(比如1或True)时,缺失的食用量才用中位数填充。否则,如果“是否”为否,则食用量应该填0。而如果“是否”本身是缺失的,可能需要先处理这个字段,比如用众数填充,或者根据其他逻辑处理。 现在,用户的代码直接用所有数据的中位数填充,不管是否的情况,这可能导致问题。例如,如果某行数据中“是否大米”为否,但“平均每次食用量”缺失,填充中位数就会导致该人没却有食用量,这是错误的。 因此,改进步骤应该是遍历每个食物的两个列:是否和食用量。对于每一行,如果“是否”是1,但食用量缺失,则用中位数填充;如果“是否”是0,食用量应该为0;如果“是否”本身缺失,可能需要先处理这个缺失,比如用众数决定是否,再处理食用量。 所以,需要分别处理每个食物组。例如,对“是否大米”和“平均每次食用量”这两列,先处理“是否”列的缺失值,比如用众数填充。然后,对于食用量列,根据是否的值来决定填充方式:如果“是否”是1,则用中位数填充缺失的食用量;如果是否是0,则将食用量设为0。 接下来,需要检查原代码中的medians计算是否正确。用户原来的代码是对所有列计算中位数,包括是否和食用量列。但“是否”可能是二元变量,用中位数填充可能不合适,应该用众数填充。而食用量列的处理应如述,根据是否的情况填充。 因此,用户可能错误地对所有列都用中位数填充,包括是否列。正确的做法应该是分开处理是否列和食用量列。可能用户没有意识到这两列的关联性,导致填充逻辑错误。 现在,我需要编写改进后的代码。首先,处理每个食物组,例如,对于每个i,columns中有两个列:是否和食用量。需要成对处理。例如,columns[0]是“是否大米”,columns[1]是“平均每次食用量.1”,以此类推。但用户给出的columns列表中,是否和食用量是相邻的,比如['是否大米', '平均每次食用量', '是否小麦面粉', '平均每次食用量.1', ...]。但看用户的columns列表,可能结构是每两列为一组,比如索引0和1是一组,2和3是一组,等等。但观察用户给出的列表,比如几项是: '是否大米', '平均每次食用量', '是否小麦面粉', '平均每次食用量.1', '是否杂粮', '平均每次食用量.2', ... 所以,每两个元素为一组,即是否和对应的平均每次食用量。因此,总共有n组,每组两个列。所以,应该将columns分成组,每组两个列:flag_col和amount_col。 因此,正确的处理步骤是: 1. 将columns按顺序两两分组,每组包含是否(flag_col)和平均食用量(amount_col)。 2. 对于每组: a. 处理flag_col的缺失值:用众数填充,因为是否是二元变量。 b. 根据flag_col的值,处理amount_col的缺失值: - 如果flag_col为1(是),则用该amount_col的中位数填充缺失值。 - 如果flag_col为0(否),则将amount_col设为0。 3. 对于其他列(如果有非食物相关的列),可能需要另外处理,但根据用户提供的columns列表,似乎所有列都是食物相关的,所以上述步骤覆盖所有情况。 现在,用户的原始代码中,medians是针对所有columns列计算中位数,然后用fillna填充。这会导致所有列的缺失值都用中位数填充,而不考虑是否的情况。例如,是否大米的列(假设是0/1)被填充中位数,可能得到0.5这样的值,这显然错误。所以,首先需要分开处理flag列和amount列。 所以,改进的代码需要: - 对每个flag_col,用众数填充缺失值。 - 对每个amount_col,根据对应的flag_col的值来填充。 具体步骤: 1. 遍历每组的flag_col和amount_col。 2. 对flag_col进行众数填充。 3. 对amount_col,根据flag_col的值进行条件填充: - flag为1时,填充其中位数。 - flag为0时,填充0。 4. 可能还需要处理flag_col和amount_col同时缺失的情况,但假设如果flag_col缺失,应该先填充flag_col的众数,再处理amount_col。 现在,编写代码: 首先,将columns分成两组: groups = [(columns[i], columns[i+1]) for i in range(0, len(columns), 2)] 但需要检查columns的度是否为偶数。用户给出的columns列表中有多个元素,例如最后的元素是'是否其他饮料', '平均每次食用量.26',所以应该是偶数,每两个为一组。 然后,对每组处理: for flag_col, amount_col in groups: # 填充flag_col的缺失值为众数 mode = df_cleanID[flag_col].mode()[0] df_cleanID[flag_col] = df_cleanID[flag_col].fillna(mode) # 计算amount_col的中位数,只考虑flag_col为1的情况 median = df_cleanID.loc[df_cleanID[flag_col] == 1, amount_col].median() # 处理amount_col的缺失值 # 当flag为1时,用中位数填充;否则设为0 df_cleanID[amount_col] = np.where( df_cleanID[flag_col].isna(), # 如果flag_col是缺失(但之已经填充,所以这一步可能不需要) np.nan, np.where( df_cleanID[flag_col] == 1, df_cleanID[amount_col].fillna(median), 0 # 如果flag为0,设为0,同时如果amount_col缺失,设为0 ) ) # 另一种方式:分两步处理 # 首先,对于flag为1且amount缺失的,填充中位数 mask_flag1 = df_cleanID[flag_col] == 1 df_cleanID.loc[mask_flag1, amount_col] = df_cleanID.loc[mask_flag1, amount_col].fillna(median) # 然后,对于flag为0的,将amount设为0 mask_flag0 = df_cleanID[flag_col] == 0 df_cleanID.loc[mask_flag0, amount_col] = 0 这样,确保当flag为0时,amount是0;当flag为1时,缺失的amount用中位数填充。同时,flag列本身的缺失值用众数填充。 这可能解决用户的问题,即异常值是因为当flag为0时,amount被填充了中位数,导致非零值,而正确的情况应该是0。 此外,用户的原始代码可能错误地对所有列都使用中位数填充,包括flag列,这会导致flag列被填充为可能非整数的值,例如0.5,这会导致后续处理错误。 总结,改进的关键点是: 1. 分开处理flag列和amount列。 2. 根据flag列的值来决定如何填充amount列。 3. 使用众数填充flag列的缺失值。 4. 确保当flag为0时,amount为0;当flag为1时,用中位数填充amount的缺失。 这样处理后,异常值的问题应该得到解决。</think>分步改进方案如下: **问题分析:** 出现异常值的主要原因是直接对全部数据使用中位数填充,没有考虑'是否'与'食用量'的逻辑关系。正确的处理应该基于是否食用的标记来填充对应的食用量。 **改进步骤:** 1. **分组处理逻辑** ```python # 将列按食物类型分组(是否,食用量) food_groups = [ ('是否大米', '平均每次食用量'), ('是否小麦面粉', '平均每次食用量.1'), ('是否杂粮', '平均每次食用量.2'), # 继续补充所有食物组... ] ``` 2. **先填充标记列** ```python for flag_col, _ in food_groups: # 用众数填充是否标记列(更符合分类特征) mode_val = df_cleanID[flag_col].mode()[0] df_cleanID[flag_col] = df_cleanID[flag_col].fillna(mode_val) ``` 3. **条件填充食用量** ```python for flag_col, amount_col in food_groups: # 计算该食物类型的中位数(仅考虑实际食用的人群) median_val = df_cleanID.loc[df_cleanID[flag_col] == 1, amount_col].median() # 创建条件掩码 mask_ate = df_cleanID[flag_col] == 1 # 实际食用的人群 mask_not_ate = df_cleanID[flag_col] == 0 # 未食用的人群 # 分情况填充 df_cleanID.loc[mask_ate, amount_col] = df_cleanID.loc[mask_ate, amount_col].fillna(median_val) df_cleanID.loc[mask_not_ate, amount_col] = 0 # 未食用者食用量应为0 ``` **完整改进代码:** ```python # 定义食物分组(需补全所有组) food_groups = [ ('是否大米', '平均每次食用量'), ('是否小麦面粉', '平均每次食用量.1'), ('是否杂粮', '平均每次食用量.2'), ('是否薯类', '平均每次食用量.3'), # 继续补充剩余组... ] # 第一步:处理是否标记列 for flag_col, _ in food_groups: if df_cleanID[flag_col].notna().any(): # 防止全空列报错 mode_val = df_cleanID[flag_col].mode()[0] df_cleanID[flag_col] = df_cleanID[flag_col].fillna(mode_val) # 第二步:条件填充食用量 for flag_col, amount_col in food_groups: if df_cleanID[flag_col].dtype == 'object': # 处理文本型标记 mask_ate = df_cleanID[flag_col].str.contains('是|', na=False) else: # 处理数值型标记 mask_ate = df_cleanID[flag_col] == 1 # 计算实际食用者的中位数 if mask_ate.any(): median_val = df_cleanID.loc[mask_ate, amount_col].median() else: median_val = 0 # 如果无人食用则默认0 # 填充逻辑 df_cleanID.loc[mask_ate, amount_col] = df_cleanID.loc[mask_ate, amount_col].fillna(median_val) df_cleanID.loc[~mask_ate, amount_col] = 0 ``` **改进点说明:** 1. 逻辑关联处理:根据是否食用的标记决定食用量的填充策略 2. 动态类型判断:兼容文本型(是/否)和数值型(1/0)标记 3. 异常值预防:未食用者强制设为0,避免不合理的中位数填充 4. 健壮性增强:添加了空值检查和全空列处理 **验证建议:** ```python # 检查未食用者的食用量是否全为0 for _, amount_col in food_groups: zero_check = df_cleanID.loc[df_cleanID[flag_col]==0, amount_col].sum() print(f"{amount_col} 未食用者非零值总数: {zero_check}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值