【问题标题】:Coalesce (SQL) functionality for Python PandasPython Pandas 的 Coalesce (SQL) 功能
【发布时间】:2018-05-05 23:52:03
【问题描述】:

全部,

我能够在pandas documentationstackoverflow 中找到一个名为“combine_first()”的函数。这仅适用于几个逻辑示例。我能够使以下内容多次结合“combine_first()”函数(在本例中为 6)。有人可以帮助找到更优雅的解决方案吗?

创建的变量“category_id”的结果应该包含第一个非缺失值,从最后一个变量(category_id7)开始,升序到第一个。如果 category_id(x) 已填充,则 category_id 应采用该值并停止处理数据框中的每一行。

d={'category_id1':[32991,32991,32991,32991,32991],
   'category_id2':[22,22,22,22,22],
   'category_id3':[33058,51,121,120,32438],
   'category_id4':[np.nan,np.nan,np.nan,np.nan,np.nan],
   'category_id5':[np.nan,np.nan,np.nan,np.nan,np.nan],
   'category_id6':[np.nan,np.nan,np.nan,np.nan,np.nan],
   'category_id7':[np.nan,np.nan,np.nan,np.nan,np.nan]
  }
df=pd.DataFrame(data=d)
df['category_id']=df.category_id7.combine_first(df.category_id6).combine_first(df.category_id5).combine_first(df.category_id4).combine_first(df.category_id3).combine_first(df.category_id2).combine_first(df.category_id1)
print(df)

【问题讨论】:

    标签: python pandas missing-data coalesce


    【解决方案1】:

    你正试图从后面级联。所以我用iloc 颠倒了列的顺序。我用pd.DataFrame.notnull() 跟进以识别哪些单元格不为空。当我随后运行pd.DataFrame.idxmax 时,我找到了每行中第一个非空值的所有列名,从后面开始。最后,我使用pd.DataFrame.lookup 来查找与找到的列关联的值。

    df.assign(
        category_id=df.iloc[:, ::-1].notnull().idxmax(1).pipe(
            lambda d: df.lookup(d.index, d.values)
        )
    )
    
       category_id1  category_id2  category_id3  category_id4  category_id5  category_id6  category_id7  category_id
    0         32991            22         33058           NaN           NaN           NaN           NaN        33058
    1         32991            22            51           NaN           NaN           NaN           NaN           51
    2         32991            22           121           NaN           NaN           NaN           NaN          121
    3         32991            22           120           NaN           NaN           NaN           NaN          120
    4         32991            22         32438           NaN           NaN           NaN           NaN        32438
    

    【讨论】:

    • 我并不完全理解所有的功能,但它完美无缺。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2017-01-15
    • 2023-03-28
    • 2020-01-19
    • 1970-01-01
    • 2021-12-24
    • 2012-11-02
    • 2021-03-26
    相关资源
    最近更新 更多