需要一些帮助...
以下是我的数据框:
+--------------+----------------+---------------+-----------------+------------+
| Planned_Date | Planned_Date_2 | Complete_Date | Complete_Date_2 | Alias_Date |
+--------------+----------------+---------------+-----------------+------------+
| 01/01/1800 | | 03/09/2020 | | 03/09/2020 |
| 01/01/1800 | 20/09/2020 | | | 20/09/2020 |
| | | | 28/09/2020 | 28/09/2020 |
| 04/10/2020 | | | | 04/10/2020 |
+--------------+----------------+---------------+-----------------+------------+
我正在尝试使用针对一些日期列的条件逻辑来创建新列(Alias_Date):
逻辑如下:
if Planned_Date = 01/01/1800
and Planned_Date_2 = null
then Complete_Date
else if Planned_Date = 01/01/1800
and Planned_Date_2 <> null
then Planned_Date_2
else if Planned_Date = null
then Complete_Date_2
else Planned_Date
我如何使用python / pandas / numpy或任何其他推荐的方式有效地做到这一点。
使用前向填充缺失值,并按位置选择最后一列DataFrame.iloc
:
df['Alias_Date'] = df.ffill(axis=1).iloc[:, -1]
如果可能,DataFrame中的其他一些列将通过列表进行选择:
cols = ['Planned_Date', 'Planned_Date_2', 'Complete_Date', 'Complete_Date_2']
df['Alias_Date'] = df[cols].ffill(axis=1).iloc[:, -1]
或前4列:
df['Alias_Date'] = df.iloc[:, :4].ffill(axis=1).iloc[:, -1]
或列Date
:
df['Alias_Date'] = df.filter(like='Date').ffill(axis=1).iloc[:, -1]
编辑:
选择列中的解决方案numpy.select
:
cols = ['Planned_Date', 'Planned_Date_2', 'Complete_Date', 'Complete_Date_2']
df[cols] = df[cols].apply(pd.to_datetime, dayfirst=True)
m1 = df['Planned_Date'].eq('1800-01-01')
m2 = df['Planned_Date_2'].isna()
m3 = df['Planned_Date'].isna()
df['Alias_Date'] = np.select([m1 & m2, m1 & ~m2, m3],
[df['Complete_Date'],
df['Planned_Date_2'],
df['Complete_Date_2']], default=df['Planned_Date'])
print (df)
Planned_Date Planned_Date_2 Complete_Date Complete_Date_2 Alias_Date
0 1800-01-01 NaT 2020-09-03 NaT 2020-09-03
1 1800-01-01 2020-09-20 NaT NaT 2020-09-20
2 NaT NaT NaT 2020-09-28 2020-09-28
3 2020-10-04 NaT NaT NaT 2020-10-04
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句