代码之家  ›  专栏  ›  技术社区  ›  Christina

如果默认列中的行为NaN,如何从dataframe中的其他列中选择行?

  •  1
  • Christina  · 技术社区  · 4 年前

    我的数据框由3列组成。第三列基于前两列。默认列是第2列。但如果第2列是NaN,那么我希望第3列用第1列填充。我在条件中添加了第三行,但它似乎不起作用。

    这是数据帧:

    df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
                       columns=['a', 'b'])
    

    这是我的代码:

    import numpy as np
    import pandas as pd
    conditions = [
        (df["b"] <= df["a"]), 
        df["b"] > df["a"],
        df["b"] == df["b"].isna()]
    
    choices = [df["b"], df["a"], df["a"]]
    
    df['c'] = np.select(conditions, choices, default=df["b"])
    print(df)
    

    这是我的输出:

               a            b      c
    0        NaN         1749.0  1749.0
    1        1717.0      1750.0  1717.0
    2        1704.0      NaN     NaN
    

    但如果a或b被填充,我希望c被填充。这就是我想要的输出:

               a            b      c
    0        NaN         1749.0  1749.0
    1        1717.0      1750.0  1717.0
    2        1704.0      NaN     1704.0
    
    3 回复  |  直到 4 年前
        1
  •  2
  •   baileythegreen    4 年前

    你只需要对你的第三个条件做一个小小的改变。 df["b"].isna() 已经回来了 True False 所以 df["b"] == df["b"].isna() 实际上是在检查 df["b"] 结果是一样的 boolean (事实并非如此)。

    只需删除第三个条件的前半部分。

    import numpy as np
    import pandas as pd
    conditions = [
        (df["b"] <= df["a"]), 
        df["b"] > df["a"],
        df["b"].isna()]
    
    choices = [df["b"], df["a"], df["a"]]
    
    df['c'] = np.select(conditions, choices, default=df["b"])
    print(df)
    
        2
  •  1
  •   le_camerone    4 年前

    这似乎有效:

    df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
                   columns=['a', 'b'])
    
    df['c'] = df.a
    
    for i in range(len(df)):
        if df.a.iloc[i] == np.nan:
            df.c.iloc[i] = df.b.iloc[i]
    
        3
  •  0
  •   ML1    4 年前

    此解决方案提供您想要的输出:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.array([[np.nan, 1717], [1749, 1750], [1704, np.nan]]),
                       columns=['a', 'b'])
    
    def fill_row(row):
        if pd.isnull(row['a']): 
            return row['b']
        else: 
            return row['a']
    
    df['c'] = df.apply(lambda row : fill_row(row), axis=1) 
    print(df)
    

    输出:

            a       b       c
    0     NaN  1717.0  1717.0
    1  1749.0  1750.0  1749.0
    2  1704.0     NaN  1704.0