Python Pandas多列求值以生成新列

Python Pandas多列求值以生成新列,python,pandas,analytics,Python,Pandas,Analytics,我试图在评估两列中是否存在值的基础上,在现有数据帧中创建一个新列 假设以下是中等规模数据集(3000万个数据点)的一部分: 我希望创建一个列来评估每个ID(本例中的Bob和Jim)是否有一个与未来3天匹配的日期值。例如,Bob123在2016-12-14和2016-12-17出现,因为这两个日期都与他有关。第一行将添加一个新列,该列表示Yes或类似的内容。下面是我希望通过新的3_DAY_STATUS列获得的输出示例: DATE |ID |3_DAY_FUTURE|3_DAY_ST

我试图在评估两列中是否存在值的基础上,在现有数据帧中创建一个新列

假设以下是中等规模数据集(3000万个数据点)的一部分:

我希望创建一个列来评估每个ID(本例中的Bob和Jim)是否有一个与未来3天匹配的日期值。例如,Bob123在2016-12-14和2016-12-17出现,因为这两个日期都与他有关。第一行将添加一个新列,该列表示Yes或类似的内容。下面是我希望通过新的3_DAY_STATUS列获得的输出示例:

DATE      |ID    |3_DAY_FUTURE|3_DAY_STATUS
2016-12-14|Bob123|2016-12-17|YES
2016-12-15|Bob123|2016-12-18|YES
2016-12-16|Bob123|2016-12-19|YES
2016-12-17|Bob123|2016-12-20|YES
2016-12-18|Bob123|2016-12-21|NO
2016-12-19|Bob123|2016-12-22|No
2016-12-20|Bob123|2016-12-23|NO
2017-01-14|Jim123|2017-01-17|YES
2017-01-15|Jim123|2017-01-18|YES
2017-01-16|Jim123|2017-01-19|YES
2017-01-17|Jim123|2017-01-20|YES
2017-01-18|Jim123|2017-01-21|NO
2017-01-19|Jim123|2017-01-22|NO
2017-01-20|Jim123|2017-01-23|NO
非常感谢您的建议。

使用
shift(-3)
np.where

df['3_DAY_STATUS'] = np.where(df.DATE.shift(-3) == df['3_DAY_FUTURE'], 'YES', 'NO')
print(df)

         DATE      ID 3_DAY_FUTURE 3_DAY_STATUS
0  2016-12-14  Bob123   2016-12-17          YES
1  2016-12-15  Bob123   2016-12-18          YES
2  2016-12-16  Bob123   2016-12-19          YES
3  2016-12-17  Bob123   2016-12-20          YES
4  2016-12-18  Bob123   2016-12-21           NO
5  2016-12-19  Bob123   2016-12-22           NO
6  2016-12-20  Bob123   2016-12-23           NO
7  2017-01-14  Jim123   2017-01-17          YES
8  2017-01-15  Jim123   2017-01-18          YES
9  2017-01-16  Jim123   2017-01-19          YES
10 2017-01-17  Jim123   2017-01-20          YES
11 2017-01-18  Jim123   2017-01-21           NO
12 2017-01-19  Jim123   2017-01-22           NO
13 2017-01-20  Jim123   2017-01-23           NO

使用创建掩码,然后通过以下方式添加新值:


谢谢@jezrael。在较小的数据集上工作很好,但在完整的数据集上需要花费数小时,因为只在一个处理器上工作。特别是这一行:mask=df.groupby('ID').apply(lambda x:x['3'u DAY\u FUTURE'].isin(df.DATE)).values,性能有点问题。第二个答案呢?第二个答案似乎没有考虑到按ID进行的分段或分组。似乎只是查找偏移量,而不管ID是否仍然是samethanks。我尝试了你的代码片段,但它似乎没有考虑到不同的ID
df['3_DAY_STATUS'] = np.where(df.DATE.shift(-3) == df['3_DAY_FUTURE'], 'YES', 'NO')
print(df)

         DATE      ID 3_DAY_FUTURE 3_DAY_STATUS
0  2016-12-14  Bob123   2016-12-17          YES
1  2016-12-15  Bob123   2016-12-18          YES
2  2016-12-16  Bob123   2016-12-19          YES
3  2016-12-17  Bob123   2016-12-20          YES
4  2016-12-18  Bob123   2016-12-21           NO
5  2016-12-19  Bob123   2016-12-22           NO
6  2016-12-20  Bob123   2016-12-23           NO
7  2017-01-14  Jim123   2017-01-17          YES
8  2017-01-15  Jim123   2017-01-18          YES
9  2017-01-16  Jim123   2017-01-19          YES
10 2017-01-17  Jim123   2017-01-20          YES
11 2017-01-18  Jim123   2017-01-21           NO
12 2017-01-19  Jim123   2017-01-22           NO
13 2017-01-20  Jim123   2017-01-23           NO
df.DATE = pd.to_datetime(df.DATE)
df['3_DAY_FUTURE'] = pd.to_datetime(df['3_DAY_FUTURE'])

mask = df.groupby('ID').apply(lambda x: x['3_DAY_FUTURE'].isin(df.DATE)).values
print (mask)
[ True  True  True  True False False False  True  True  True  True False

df['3_DAY_STATUS'] = np.where(mask, 'YES', 'NO')
print (df)
         DATE      ID 3_DAY_FUTURE 3_DAY_STATUS
0  2016-12-14  Bob123   2016-12-17          YES
1  2016-12-15  Bob123   2016-12-18          YES
2  2016-12-16  Bob123   2016-12-19          YES
3  2016-12-17  Bob123   2016-12-20          YES
4  2016-12-18  Bob123   2016-12-21           NO
5  2016-12-19  Bob123   2016-12-22           NO
6  2016-12-20  Bob123   2016-12-23           NO
7  2017-01-14  Jim123   2017-01-17          YES
8  2017-01-15  Jim123   2017-01-18          YES
9  2017-01-16  Jim123   2017-01-19          YES
10 2017-01-17  Jim123   2017-01-20          YES
11 2017-01-18  Jim123   2017-01-21           NO
12 2017-01-19  Jim123   2017-01-22           NO
13 2017-01-20  Jim123   2017-01-23           NO