【问题标题】:pandas using list comprehension to create new columnpandas 使用列表理解创建新列
【发布时间】:2019-12-26 19:26:42
【问题描述】:

我有如下日期范围和数据框列表: [('2019-01-01', '2019-01-04'), ('2019-12-25', '2019-12-28'), ('2019-18-29', '2019-12-21'),]

+------------+---+------+
|    date    | id|      |
+------------+---+------+
| 2018-01-04 | 1 |      |
| 2018-01-02 | 1 |      |
| 2018-01-01 | 1 |      |
| 2017-12-28 | 1 |      |
| 2017-12-27 | 1 |      |
| 2017-12-26 | 1 |      |
| 2017-12-25 | 1 |      |
| 2017-12-21 | 1 |      |
| 2017-12-20 | 1 |      |
| 2017-12-18 | 1 |      |
+------------+---+------+

预期输出:

+------------+---+------+-------+
|    date    |id | group|       |
+------------+---+------+-------+
| 2018-01-04 | 1 |    1 |       |
| 2018-01-02 | 1 |    1 |       |
| 2018-01-01 | 1 |    1 |       |
| 2017-12-28 | 1 |    2 |       |
| 2017-12-27 | 1 |    2 |       |
| 2017-12-26 | 1 |    2 |       |
| 2017-12-25 | 1 |    2 |       |
| 2017-12-21 | 1 |    3 |       |
| 2017-12-20 | 1 |    3 |       |
| 2017-12-18 | 1 |    3 |       |
+------------+---+------+-------+

如果 date = "2019-01-01" 等等,我尝试使用列表理解来分配 1,但它不起作用。 谁能帮帮我?

【问题讨论】:

  • 您是否手动分配这些范围?或者这背后有什么逻辑?
  • 我手动分配它,我想要的逻辑只是按日期列分组,条件给定日期范围

标签: python python-3.x pandas


【解决方案1】:

应该这样做:

import pandas as pd

df['date'] = pd.to_datetime(df['date'])

def f(x):
    if (x <= pd.Timestamp('2018-01-04')) & (x >= pd.Timestamp('2018-01-01')):
        return(1)
    elif (x <= pd.Timestamp('2017-12-28')) & (x >= pd.Timestamp('2017-12-25')):
        return(2)
    elif (x <= pd.Timestamp('2017-12-20')) & (x >= pd.Timestamp('2017-12-18')):
        return(3)

df['group'] = df['date'].apply(f)

编辑:

或者,您可以这样做:

date_ranges = [pd.date_range(start='2018-01-04', end='2018-01-01'), 
pd.date_range(start='2017/12/25', end='2017/12/28'),
pd.date_range(start='2017/12/18', end='2017/12/20'),
]

df['group'] = df['date'].apply(lambda x: [i for i, date_rng in enumerate(date_ranges) if x in date_rng][0])

【讨论】:

  • 为了更灵活,我如何输入日期范围作为函数的参数: date_range = [('2019-01-01', '2019-01-04'), ('2019-12 -25', '2019-12-28'), ('2019-18-29', '2019-12-21')], 那么例如:可以替换 pd.Timestamp('2018-01-04') ) 由 date_range[0][1]
  • @Kleine 请参阅上面的编辑。不完全按照您的要求,但是将 date range 作为要输入的参数会使事情变得更加复杂。
  • @Kleine 太好了!乐于助人。
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多