【问题标题】:Change values in one column based on condition of another column's values in Pandas根据 Pandas 中另一列值的条件更改一列中的值
【发布时间】:2020-08-20 16:27:41
【问题描述】:

对于以下屏幕截图,如果ge65_suppress_flag 的值具有# 符号,我想将total_claim_count_ge65 下的NaN 值更改为5

我想使用 for 循环遍历 ge65_suppress_flag 列,每次遇到 # 符号时,它都会将下一列 (total_claim_count_ge65) 中的 NaN 值更改为 @ 987654332@.

【问题讨论】:

标签: python pandas


【解决方案1】:

我会在给你解决方案后一步一步解释。

这是一个可行的单线。

df[df[0]=='#'] = df[df[0]=='#'].fillna(5)

为了使解决方案更通用,我根据您的屏幕截图使用了列的索引。您可以更改索引号,或按名称指定,如下所示:

df['name_of_column']

分步说明:

首先,您想使用第一列df[0] 中的变量属性来仅选择等于字符串'#' 的那些:

df[df[0]=='#']

接下来,使用 pandas 的fillna 方法将所有np.NaN 的变量属性替换为5

df[df[0]=='#'].fillna(5)

根据fillna 文档,此函数返回一个新数据帧。因此,为避免这种情况,您希望将数据框的子部分设置为函数返回的内容:

df[df[0]=='#'] = df[df[0]=='#'].fillna(5)

【讨论】:

    【解决方案2】:

    df.applylambda 一起使用:

    d = {'ge65_suppress_flag': ['not_supressed','not_supressed','#'], 'total_claim_count_ge65': [516.03, 881.0, np.nan]}
    df = pd.DataFrame(data=d)
    df['total_claim_count_ge65'] = df.apply(lambda x: 5 if x['ge65_suppress_flag']=='#' else x['total_claim_count_ge65'], axis=1)
    print(df)
    

    打印:

      ge65_suppress_flag  total_claim_count_ge65
    0      not_supressed                  516.03
    1      not_supressed                  881.00
    2                  #                    5.00
    

    【讨论】:

    • 谢谢你粉红色的spikyhairman。这非常有效。屏幕截图来自一个拥有大约 100 万列的数据集。我把这些列变成了列表并应用了你的代码,它能够完成所有的行。我想知道是否有办法做到这一点而不必创建一个新的数据框。假设这两列是大数据框中 70 列中的 2 列,您必须创建这个新数据框,然后返回到更大的主数据框,合并这 2 个新列并删除 2 个旧列。
    • 如果您在数据框 df 中有原始的 70 列数据,并且列名相同,那么我的解决方案的行 df['total_claim_count_ge65'] = df.apply(lambda x: 5 if x['ge65_suppress_flag']=='#' else x['total_claim_count_ge65'], axis=1) 将按原样在该数据框上工作。
    【解决方案3】:

    创建一个相似的数据框

    import pandas
    df1 = pd.DataFrame({"ge65_suppress_flag": ['bla', 'bla', '#', 'bla'], "total_claim_count_ge65": [1.0, 2.0, None, 4.0]})
    

    ge65_suppress_flag列值等于'#'的行中填入5.0

    df1.loc[df1['ge65_suppress_flag']=="#", 'total_claim_count_ge65'] = 5.0
    

    【讨论】:

    • 感谢Permanent Pon。这工作得很好。我所拥有的屏幕截图只是我正在查看的数据的一小部分,我使用了你的想法并稍作修改。我将 2 列转换为列表,并在数据框方法中使用它们来完成由大约 100 万行组成的全部列。我想知道是否有办法做到这一点,而不必创建一个新的数据框。
    【解决方案4】:

    尝试类似:

    df[df['ge65_suppress_flag'] == '#']['total_claim_count_ge65'].fillna(5, inplace=True)
    

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多