2017-02-10 82 views
1

我想在現有數據框中創建一個新列,它基於評估值是否存在於兩列中。熊貓多列評估生成新列

假定以下是一箇中型數據集的一部分(30萬個數據點):

DATE  |ID |3_DAY_FUTURE 
2016-12-14|Bob123|2016-12-17 
2016-12-15|Bob123|2016-12-18 
2016-12-16|Bob123|2016-12-19 
2016-12-17|Bob123|2016-12-20 
2016-12-18|Bob123|2016-12-21 
2016-12-19|Bob123|2016-12-22 
2016-12-20|Bob123|2016-12-23 
2017-01-14|Jim123|2017-01-17 
2017-01-15|Jim123|2017-01-18 
2017-01-16|Jim123|2017-01-19 
2017-01-17|Jim123|2017-01-20 
2017-01-18|Jim123|2017-01-21 
2017-01-19|Jim123|2017-01-22 
2017-01-20|Jim123|2017-01-23 

我期待創建評估每個ID(Bob和吉姆在這個例子中)是否具有柱日期值與未來3天相匹配。例如,Bob123在2016-12-14和2016-12-17出席,因爲這兩個DATE都與他有關。第一行將添加一個新的列,說是或類似的東西。這裏是我希望用一個新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 

任何建議都非常讚賞。

回答

2

isin創建面具由groupby通過ID然後numpy.where添加新值:

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 
+0

謝謝@jezrael。在較小的數據集上工作得很好,但由於只能在一個處理器上工作,因此確實需要花費數小時才能完成整個數據集。這條線特別是:mask = df.groupby('ID')。apply(lambda x:x ['3_DAY_FUTURE']。isin(df.DATE))。值 – echoecho256

+0

是的,它的性能有點問題。第二個答案呢? – jezrael

+0

第二個答案似乎沒有考慮到按ID分割或分組。似乎只是尋找一個偏移量,無論ID是否仍然相同 – echoecho256

1

使用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 

+0

感謝。我試過你的片段,但它似乎沒有考慮到不同的ID – echoecho256