熊猫:如何使用groupy&标记列。申请()

时间:2018-02-15 00:34:11

标签: python pandas pandas-groupby

现在,我的代码将返回符合我函数中条件的行。如果条件为真,我该如何返回所有原始行并标记一个新列('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的新列。

1 个答案:

答案 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