Python PANDAS: 新列,对所有行应用唯一值

Python PANDAS: New Column, Apply Unique Value To All Rows

只是在寻找一个最好的方法,因为有人在数据分析领域花费的时间比正确的编程时间还多(给大家提个小费)。非常简单,大型 ETL 项目,但在 Python 中手动编码,这是第一个。固定宽度文件被成功读入初始 PANDAS df。

我正在尝试添加一个具有静态月末日期值(例如 2014-01-31)的新列,指示 "Data Month" 以进行进一步的 EDW 处理。最终,我将使用 datetime/timedelta 功能将此值作为我在实用程序服务器上进行 CRON 时自动生成的值进行传递。

如果我需要引用原始 df 中的索引值以将完全不相关的值应用于初始 df,我的困惑似乎是关于使用哪个函数(apply、mapapply 等),而且最优化的 pythonic 方式来完成这个。

当前参考:"Python for Data Analysis"、PANDAS 文档。谢谢!

编辑

下面是一些固定宽度数据的小例子:

5151022314 
5113 22204
111  20018

这里有一些代码可以将它读入 PANDAS df:

import pandas as pd
import numpy as np

path = 'C:\Users\Office\Desktop\example data.txt' 
widths = [2, 3, 5]
names = (['STATE_CD', 'CNTY_CD', 'ZIP_CD',])

df = pd.read_fwf(path, names=names, widths=widths, header=0)

这应该 return 类似于上面示例日期的 df:

STATE_CD,CNTY_CD,ZIP_CD
51,510,22314     
51,1  ,22204
11,3  ,20018

我想要做的是为所有行添加一列 "DATA_MM",如下所示:

STATE_CD,CNTY_CD,ZIP_CD, DATA_MM
51,510,22314,2014-01-31     
51,1  ,22204,2014-01-31
11,3  ,20018,2014-01-31

最终,我希望利用类似这样的东西来生成这个月度作业启动时自动应用的值:

import datetime
today = datetime.date.today()
first = datetime.date(day=1, month=today.month, year=today.year)
lastMonth = first - datetime.timedelta(days=1)
print lastMonth.strftime("%Y-%m-%d")

假设您的 DataFrame 名为 df,它有一个时间戳的日期列,您想获取月末 (EOM) 值:

df['EOM date'] = df.date.apply(lambda x: x.to_period('M').to_timestamp('M'))

您正在将对象强制转换为 Pandas 个 Period 对象,然后返回到月末时间戳,因此这可能不是最有效的方法。

这是具有一些性能统计信息的替代实现:

dates = pd.date_range('2000-1-1', '2015-1-1')
df = pd.DataFrame(dates, columns=['date'])

%%timeit
df.date.apply(lambda x: x.to_period('M').to_timestamp('M'))
10 loops, best of 3: 161 ms per loop

%%timeit
df.date.apply(lambda x: x + pd.datetools.MonthEnd())
1 loops, best of 3: 177 ms per loop

只需从当前日期获取月末日期的 DATETIME.DATE(根据下面的请求),如下所示:

pd.Timestamp(dt.datetime.now()).to_period('M').to_timestamp('M').date()

如果您想用不依赖于原始 DataFrame 的新值填充列,则无需引用原始索引。您可以通过简单地为其分配新值来填充新列:

df["DATA_MM"] = date

您可以使用 datetimecalendar:

获取该月的最后一天
import datetime
import calendar

today = datetime.date.today()
y = today.year
m = today.month
eom = datetime.date(y, m, calendar.monthrange(y, m)[1])

df["DATA_MM"] = eom

monthrange returns 包含月份的第一天和最后一天的元组,因此 [1] 引用月份的最后一天。您还可以使用@Alexander 的方法来查找最后一天的日期,并将其直接分配给列而不是 applying 它。