现在,我的代码将返回符合我函数中条件的行。如果条件为真,我该如何返回所有原始行并标记一个新列('GreaterDate)?
df = pd.DataFrame({'KEY': ['100000003', '100000009', '100000009', '100000009', '100000009','100000034','100000034', '100000034'],
'Date1': [20120506, 20120506, 20120507,20120608,20120620,20120206,20120306,20120506],
'Date2': [20120528, 20120507, 20120615,20120629,20120206,20120305,20120506,20120506]})
def date_compare(df):
date_before = df['Date1'].shift(-1)
value = df[df['Date2'] == date_before]
return value
dftest = df.groupby('KEY').apply(date_compare)
dftest
这会返回两个真值。
Date1 Date2 KEY
KEY
100000009 1 20120506 20120507 100000009
100000034 6 20120306 20120506 100000034
我尝试过使用
dftest['GreaterDate'] = df.groupby('KEY').apply(date_compare)
但这不起作用。 我对日期函数的工作不是很感兴趣,我只是用这个函数作为例子。我更感兴趣的是如何在groupby上使用apply以添加一个True或False的新列。
答案 0 :(得分:1)
这是一种方式:
def date_compare(df):
df['dftest'] = df['Date2'] == df['Date1'].shift(-1)
return df
dftest = pd.concat([df[df.KEY == k].pipe(date_compare) \
for k in set(df.KEY)], ignore_index=True)
# Date1 Date2 KEY dftest
# 0 20120506 20120507 100000009 True
# 1 20120507 20120615 100000009 False
# 2 20120608 20120629 100000009 False
# 3 20120620 20120206 100000009 False
# 4 20120206 20120305 100000034 False
# 5 20120306 20120506 100000034 True
# 6 20120506 20120506 100000034 False
# 7 20120506 20120528 100000003 False