使用 else if 逻辑将条件列添加到 Pandas 数据框 - Python

Posted

技术标签:

【中文标题】使用 else if 逻辑将条件列添加到 Pandas 数据框 - Python【英文标题】:Add conditional column to Pandas Data Frame using else if logic - Python 【发布时间】:2021-01-28 19:25:23 【问题描述】:

需要帮助...

下面是我的数据框

+--------------+----------------+---------------+-----------------+------------+
| 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 或任何其他推荐的方式有效地做到这一点。

【问题讨论】:

【参考方案1】:

使用前向填充缺失值并使用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

【讨论】:

您好,jezrael,感谢您的及时回复。这是一个非常聪明的解决方案,但是,数据来自一个数据库,其中有数百个其他列,而且这些列不是按这个顺序排列的。此外,添加了新列并删除了其他列。因此,尽管这可以在提供的上下文中工作,但对于当前设置来说它不够动态。很抱歉没有在问题中提供此信息。抱歉,只是补充一下,列并不总是空的,如示例数据集中所示,这只是一个简单的示例,以显示我想要实现的目标。

以上是关于使用 else if 逻辑将条件列添加到 Pandas 数据框 - Python的主要内容,如果未能解决你的问题,请参考以下文章

scss 使用@if和@else将逻辑添加到您的样式中

使用 pyspark 基于 if 和 else 条件创建新列

if else 逻辑关系问题

使用 If-Then-Else 逻辑进行分支

根据 if-elif-else 条件创建新列时出错

Jade 条件(if/else)将类添加到 div 内联