繁体   English   中英

熊猫使用列表理解来创建新列

[英]pandas using list comprehension to create new column

我有如下日期范围和数据框列表: [('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 |       |
+------------+---+------+-------+

我尝试使用列表理解来分配 1 if date <= "2019-01-04" & date >="2019-01-01" 等等,但它不起作用。 任何人都可以帮助我吗?

这应该这样做:

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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM