Python 熊猫分组标记日期少于n个月
在这个例子中,col1有两个不同的类别。如果我们说n个月=12,那么我们如何计算那些满足的类别,这样一个新的列将标记类别a为真,而类别B为假,因为它大于n=12个月Python 熊猫分组标记日期少于n个月,python,pandas,Python,Pandas,在这个例子中,col1有两个不同的类别。如果我们说n个月=12,那么我们如何计算那些满足的类别,这样一个新的列将标记类别a为真,而类别B为假,因为它大于n=12个月 d_ex = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'A'], 'col2': ['2019-01-01', '2018-02-01', '2015-01-01', '2019-01-0
d_ex = pd.DataFrame({'col1': ['A', 'A', 'B', 'B', 'A'],
'col2': ['2019-01-01', '2018-02-01',
'2015-01-01', '2019-01-01', '2019-05-01']})
d_ex['col2'] = pd.to_datetime(d_ex['col2'])
我试过了
d_ex.groupby(['col1'])['col2'].diff()
但这是行不通的。此外,该类别可能会出现两次以上的事件,因此,如果第三次出现日期为2015年的a类事件,我希望将其标记为False,但其他两次仍然为true
我发现了这一点,但我不确定如何将代码更改为不使用idxmax
尝试给出的解决方案
(d_ex.groupby('col1')['col2'].diff().apply(lambda x: my_abs(x))
.apply(lambda x: set_condition(x)).bfill())
返回
0 True
1 True
2 False
3 False
4 False
但是索引4应该为真创建数据帧:
将熊猫作为pd导入
d_ex=pd.DataFrame({'col1':['A','A','B','B','A'],
“col2”:[“2019-01-01”、“2018-02-01”,
'2015-01-01', '2019-01-01', '2019-05-01']})
d_ex['col2']=pd.to_datetime(d_ex['col2'])
#对列进行排序
d_ex.sort_值(['col1','col2'],inplace=True)
col1 col2
A 2018-02-01
A 2019-01-01
A 2019-05-01
B 2015-01-01
B 2019-01-01
分组差异:
为每个组返回一个diff
对象timedelta
始终适用于组内的第一次出现NaT
d_ex['diff']=d_ex.groupby('col1').diff()
col1 col2 diff
A 2018-02-01 NaT
A 2019-01-01 334天
A 2019-05-01 120天
B 2015-01-01 NaT
B 2019-01-01 1461天
返回差分abs的函数
在abs
上不起作用,因此不能只应用NaT
abs
- 如果在
和col1
上使用col2
,则可以跳过此步骤sort\u值
def my_abs(x):
尝试:
x=绝对值(x)
除类型错误外:
x=x
返回x
#应用函数
d_ex['diff']=d_ex['diff'].应用(lambda x:my_abs(x))
col1 col2 diff
A 2018-02-01 NaT
A 2019-01-01 334天
A 2019-05-01 120天
B 2015-01-01 NaT
B 2019-01-01 1461天
用于设置条件的函数,如果NaT为None
- 由于使用了
和groupby
,任何组的第一行都应该是NaTdiff
- 将
设置为无,然后可以NaT
反写它
def set_条件(x):
如果类型(x)==pd._libs.tslibs.nattype.nattype:
x=无
elif x创建数据帧:
将熊猫作为pd导入
d_ex=pd.DataFrame({'col1':['A','A','B','B','A'],
“col2”:[“2019-01-01”、“2018-02-01”,
'2015-01-01', '2019-01-01', '2019-05-01']})
d_ex['col2']=pd.to_datetime(d_ex['col2'])
#对列进行排序
d_ex.sort_值(['col1','col2'],inplace=True)
col1 col2
A 2018-02-01
A 2019-01-01
A 2019-05-01
B 2015-01-01
B 2019-01-01
分组差异:
diff
为每个组返回一个timedelta
对象
NaT
始终适用于组内的第一次出现
d_ex['diff']=d_ex.groupby('col1').diff()
col1 col2 diff
A 2018-02-01 NaT
A 2019-01-01 334天
A 2019-05-01 120天
B 2015-01-01 NaT
B 2019-01-01 1461天
返回差分abs的函数
abs
在NaT
上不起作用,因此不能只应用abs
- 如果在
col1
和col2
上使用sort\u值
,则可以跳过此步骤
def my_abs(x):
尝试:
x=绝对值(x)
除类型错误外:
x=x
返回x
#应用函数
d_ex['diff']=d_ex['diff'].应用(lambda x:my_abs(x))
col1 col2 diff
A 2018-02-01 NaT
A 2019-01-01 334天
A 2019-05-01 120天
B 2015-01-01 NaT
B 2019-01-01 1461天
用于设置条件的函数,如果NaT为None
- 由于使用了
groupby
和diff
,任何组的第一行都应该是NaT
- 将
NaT
设置为无,然后可以反写它
def set_条件(x):
如果类型(x)==pd._libs.tslibs.nattype.nattype:
x=无
elif x@bbd108答案已更新为排序col1
和col2
。这也消除了使用my_abs
@bbd108的需要。答案已更新为排序col1
和col2
。这也消除了使用my_abs
的需要。