首页 > 解决方案 > 根据数据框上的值创建一个新列 - Pandas

问题描述

我有一个看起来像这样的数据框:

orderID         m1              m2              m3      
1       2020-03-04      2020-03-04             NaT
2       2020-03-08             NaT             NaT

我想创建一个新列,显示可用于订单的最新里程碑 (mn)。

输出看起来像这样

orderID         m1              m2              m3          last_m_available
1       2020-03-04      2020-03-04             NaT                        m2
2       2020-03-08             NaT             NaT                        m1

我将如何用 python 做到这一点?

标签: pythonpandas

解决方案


您可以交换列的顺序,测试不缺失值并使用DataFrame.idxmax

#if orderID is not index
df = df.set_index('orderID')

df = df.apply(pd.to_datetime)
df['last_m_available'] = df.iloc[:, ::-1].notna().idxmax(axis=1)
print (df)
                m1         m2  m3 last_m_available
orderID                                           
1       2020-03-04 2020-03-04 NaT               m2
2       2020-03-08        NaT NaT               m1

如果可能的话,一些只有缺失值的行:

df = df.apply(pd.to_datetime)
mask = df.iloc[:, ::-1].notna()
df['last_m_available'] = np.where(mask.any(axis=1), mask.idxmax(axis=1), np.nan)
print (df)
                m1         m2  m3 last_m_available
orderID                                           
1       2020-03-04 2020-03-04 NaT               m2
2              NaT        NaT NaT              NaN

推荐阅读