向数据框架中添加日期指标变量的有效方法

2024-10-03 06:26:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的DataFrame,有数百万行,其中一列是date。我想添加5列到它是0/1为工作日。你知道吗

dates = pd.date_range('1700-01-01', '2017-07-02')
df = pd.DataFrame({'date':dates, 'Values':np.random.normal(size = len(dates))})
df

          date      value
0   1700-01-01  -1.239422
1   1700-01-02  -0.209840
2   1700-01-03   0.146293
3   1700-01-04   1.422454
4   1700-01-05   0.453222
...

我正努力实现以下目标:

df['isMonday'] = df.apply(lambda x: 1 if x['date'].weekday() == 0 else 0, axis=1)
df['isTuesday'] = df.apply(lambda x: 1 if x['date'].weekday() == 1 else 0, axis=1)
df['isWednesday'] = df.apply(lambda x: 1 if x['date'].weekday() == 2 else 0, axis=1)
df['isThursday'] = df.apply(lambda x: 1 if x['date'].weekday() == 3 else 0, axis=1)
df['isFriday'] = df.apply(lambda x: 1 if x['date'].weekday() == 4 else 0, axis=1)
df

          date      value  isMonday  isTuesday isWednesday isThursday isFriday
0   1700-01-01  -1.239422        0           0           0          0        1
1   1700-01-02  -0.209840        0           0           0          0        0
2   1700-01-03   0.146293        0           0           0          0        0
3   1700-01-04   1.422454        1           0           0          0        0
4   1700-01-05   0.453222        0           1           0          0        0
...

这很慢。实现这一目标的最有效方法是什么。你知道吗


Tags: lambda目标dataframedfdateifvalueelse
1条回答
网友
1楼 · 发布于 2024-10-03 06:26:51

请尝试以下操作:

df.join(pd.get_dummies("is"+df.date.dt.weekday_name))

应产生:

#      Values       date  isFriday  isMonday  isSaturday  isSunday  isThursday  \
# 0  0.107486 1700-01-01         1         0           0         0           0   
# 1 -0.418628 1700-01-02         0         0           1         0           0   
# 2 -0.336569 1700-01-03         0         0           0         1           0   
# 3  0.322989 1700-01-04         0         1           0         0           0   
# 4 -1.025901 1700-01-05         0         0           0         0           0   
# 5 -0.297524 1700-01-06         0         0           0         0           0   
# 6  0.824080 1700-01-07         0         0           0         0           1   
# 7 -0.286943 1700-01-08         1         0           0         0           0   
# 8 -1.774486 1700-01-09         0         0           1         0           0   
# 9  1.029038 1700-01-10         0         0           0         1           0   

#    isTuesday  isWednesday  
# 0          0            0  
# 1          0            0  
# 2          0            0  
# 3          0            0  
# 4          1            0  
# 5          0            1  
# 6          0            0  
# 7          0            0  
# 8          0            0  
# 9          0            0 

这里发生的事情是,您将获得datetime值的星期日名称,并在它们前面加上字符串“is”。完成后,将函数pd.get_dummies应用于结果。pd.get_dummiespd.get_dummies输出的每个值生成一列,并用1填充匹配的行,而不匹配的行则用0填充。这将是一个新的数据帧,您可以将它join添加到原始的数据帧中。你知道吗

编辑:

版本0.16.2解决方案:

weekday_names = {0: 'Monday',
                 1: 'Tuesday',
                 2: 'Wednesday',
                 3: 'Thursday',
                 4: 'Friday',
                 5: 'Saturday',
                 6: 'Sunday'}

df.join(pd.get_dummies("is"+df.date.dt.weekday.apply(lambda x: weekday_names.get(x))))

我希望这有帮助。你知道吗

相关问题 更多 >