首页 > 解决方案 > 根据 Pandas 系列中的元素创建遮罩

问题描述

我有一个大约 250k 行的数据框,这是创建它的小版本的代码;

some_dict = {'month end': {0: pd.Timestamp('2020-10-31 00:00:00'),1: pd.Timestamp('2020-10-31 00:00:00')},'end date': {0: pd.Timestamp('2021-02-21 00:00:00'),1: pd.Timestamp('2021-10-20 00:00:00')},'value': {0: 36.15, 1: 40.10}}
df = pd.DataFrame(some_dict)

以前我使用掩码来获取valueend date是否在列month end + 2 days和之间month end + 3 days,就像这样;

mask = (df['end date'] > (df['month end'] + pd.Timedelta(2, 'days'))) & (df['end date'] <= (df['month end'] + pd.Timedelta(3, 'days')))
df['test'] = df.loc[mask, 'value']

现在我正在尝试根据下面的行创建一个蒙版;

mask = (df['End Date'].day > (df['month end'] + pd.Timedelta(2, 'days')).day) & (df['End Date'].day <= (df['month end'] + pd.Timedelta(3, 'days')).day) & (df['End Date'] >= (df['month end'] + pd.Timedelta(3, 'days')))
df['Greater than 2 days up to 3 days'] = df.loc[mask, 'value']

这应该True用于具有 value的行40.10False具有 value 的行36.15。但两者都df['End Date'].day产生(df['month end'] + pd.Timedelta(2, 'days')).day一个错误,说'Series' object has no attribute 'day'. 我想知道是否可以创建一个使用对象内的Series对象的蒙版?在我的情况下,我有pd.Timestamp,我想使用pd.Timestamp.day.

上面的掩码是针对一列的,如果这可以顺利运行,我会尝试对其他列执行相同的操作,例如Greater than 4 days up to 5 days,Greater than 2 weeks up to 3 weeksGreater than 2 months up to 3 months

编辑:我尝试创建额外的列,包括这样的month end日子

df['month end day'] = df.loc[0, 'month end'].day

然后使用df['month end day']而不是创建掩码df['month end'].day,但这对end date-column 不起作用,因为它在每一行中没有相同的值,并且写入

df['end date day'] = df.loc[:, 'end date'].day

给出同样的错误'Series' object has no attribute ´day´

标签: pythonpandas

解决方案


就像您必须使用.str来访问系列中的字符串方法一样,您还需要使用dt来访问系列值的datetimelike 属性。如果从 Series 访问特定Timestamp值,则无需使用dt,因为您Timestamp直接使用。

所以,总结一下,只要使用就df['end date'].dt.day可以了。


推荐阅读