我有一个看起来像这样的数据框:
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做到这一点?
答案 0 :(得分:2)
您可以交换列顺序,测试不丢失值并使用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
答案 1 :(得分:0)
您可以使用dataframe.dropna()
来清除列表中的空列。
cols = df.dropna().columns
df['last_m_available'] = cols
print(df)
m1 m2 m3 last_m_available
orderID
1 2020-03-04 2020-03-04 NaN m2
2 2020-03-08 NaN NaN m1