python - pandas 使用列表理解创建新列
问题描述
我的日期范围和数据框列表如下: [('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])
推荐阅读
- c# - 如何使用 XAML 样式模板绑定到另一个对象属性?
- excel - 使用 VBA 上传到 Web
- devops - Jenkins 工作级别权限
- reactjs - 如何在 Angular2/ts 文件中使用 React.js 类/库
- angular - IE11(版本:11.967.16299.0)之一不支持角度数据网格(ag-grid-ng2)
- appium - 键盘输入键在 appium java-client 6.0.0-BETA2 中不起作用
- java - Koshuke Github api 403 在一段时间后被禁止
- list - AppleScript:只保留列表中的单词
- python - 删除行值类似于“[]”的数据框列
- function - 函数中的返回码和整体返回码