基于其他人的列值创建新列

时间:2019-05-27 02:12:36

标签: python python-3.x

我正在尝试为熊猫数据框做一些特征工程。

说我有这个:

Data frame 1:
X |  date     | is_holiday
a |  1/4/2018 | 0
a |  1/5/2018 | 0
a |  1/6/2018 | 1
a |  1/7/2018 | 0
a |  1/8/2018 | 0
...
b |  1/1/2018 | 1

我想为某些日期添加一个额外的指示器,以指示该日期是否在节假日的第一天和第二天之前,以及之后的第一天和第二天之后。

Data frame 1:
X |  date     | is_holiday | one_day_before_hol | ... | one_day_after_hol
a |  1/4/2018 | 0          | 0                  | ... | 0
a |  1/5/2018 | 0          | 1                  | ... | 0
a |  1/6/2018 | 1          | 0                  | ... | 0
a |  1/7/2018 | 0          | 0                  | ... | 1
a |  1/8/2018 | 0          | 0                  | ... | 0
...
b |  1/1/2018 | 1          | 0                  | ... | 0

有什么有效的方法吗?我相信我可以使用for语句来做到这一点,但是由于我是python的新手,所以我想看看是否有一种优雅的方法。 日期可能不是相邻的或连续的(例如,对于某些X列,可能没有特定的日期)

非常感谢您!

2 个答案:

答案 0 :(得分:1)

使用pandas.DataFrame.groupby.shift

import pandas as pd

g = df.groupby('X')['is_holiday']
df['one_day_before'] = g.shift(-1).fillna(0)
df['two_day_before'] = g.shift(-2).fillna(0)
df['one_day_after'] = g.shift(1).fillna(0)

输出:

   X      date  is_holiday  one_day_before  two_day_before  one_day_after
0  a  1/4/2018           0             0.0             1.0            0.0
1  a  1/5/2018           0             1.0             0.0            0.0
2  a  1/6/2018           1             0.0             0.0            0.0
3  a  1/7/2018           0             0.0             0.0            1.0
4  a  1/8/2018           0             0.0             0.0            0.0
5  b  1/1/2018           1             0.0             0.0            0.0

答案 1 :(得分:1)

您可以转移:

import pandas as pd
df = pd.DataFrame([1,0,0,1,1,0], columns=['day'])
d.head()

   day
0   1
1   0
2   0
3   1
4   1

df['Once Day Before'] = d['day'].shift(-1)
df['One Day After'] = df['day'].shift(1)
df['Two Days before'] = df['day'].shift(-2)

df.head()

day Holiday   One Day Before    One Day After   Two Days before
0     1            0.0               NaN              0.0
1     0            0.0               1.0              1.0
2     0            1.0               0.0              1.0
3     1            1.0               0.0              0.0
4     1            0.0               1.0              NaN
5     0            NaN               1.0              NaN

这会将is_holiday上下移动并移至新列。但是,您将不得不处理NaN。