Създаване на нова колона, която намира разликата в датите въз основа на условие

Имам следната рамка от данни:

df=

Date     Team1     Team2     
6/1      Boston    New York  
6/13     New York  Chicago   
6/27     Boston    New York  
6/28     Chicago   Boston   

Бих искал да създам нова колона, която намира разликата в датите въз основа на условието на team1. Пример), когато Чикаго е Отбор 1, бих искал да намеря броя на дните от последната игра, независимо дали са били Отбор 1 или Отбор 2 в предишната игра.

df=

Date     Team1     Team2      Days since Team1 played
6/1      Boston    New York   0
6/13     New York  Chicago    12
6/27     Boston    New York   26
6/28     Chicago   Boston     15

person RyanG73    schedule 16.12.2018    source източник


Отговори (1)


Вашият очакван резултат е близък, но бих създал мултииндекс

използвайте melt и diff след това pivot

# melt to get Teams as one columns
melt = df.melt('Date').sort_values('Date')

# groupby and find the difference
melt['diff'] = melt.groupby('value')['Date'].diff()

# pivot to go back to the original df format
melt.pivot('Date','variable') 

                  value              diff
variable     Team1    Team2     Team1     Team2
      Date              
2018-06-01  Boston   New York    NaT       NaT
2018-06-13  New York Chicago     12 days   NaT
2018-06-27  Boston   New York    26 days   14 days
2018-06-28  Chicago  Boston      15 days   1 days

Актуализация

Ето актуализация според вашия коментар:

# assume this df
    Date         Team1   Team2
0   2018-06-01  Boston    New York
1   2018-06-13  New York  Chicago
2   2018-06-27  Boston    New York
3   2018-06-28  Chicago   Boston
4   2018-06-28  New York  Detroit

Код:

# melt df (same as above example)
melt = df.melt('Date').sort_values('Date')

# find the difference
melt['diff'] = melt.groupby('value')['Date'].diff()

# use pivot_table not pivot
piv = melt.pivot_table(index=['Date', 'diff'], columns='variable', values='value', aggfunc=lambda x:x)

# reset index and dropna from team 1
piv.reset_index(level=1, inplace=True)
piv = piv[~piv['Team1'].isna()]

# merge your original df and your new one together
pd.merge(df, piv[piv.columns[:-1]], on=['Date','Team1'], how='outer').fillna(0)

         Date   Team1     Team2     diff
0   2018-06-01  Boston    New York  0 days
1   2018-06-13  New York  Chicago   12 days
2   2018-06-27  Boston    New York  26 days
3   2018-06-28  Chicago   Boston    15 days
4   2018-06-28  New York  Detroit   1 days

Имайте предвид, че разликата този път е само от последния път, когато Team1 е играл

person It_is_Chris    schedule 16.12.2018
comment
прав си.. Поправих печатната грешка в оригиналния пост. - person RyanG73; 16.12.2018
comment
за съжаление получавам тази грешка, когато се прилага към по-голямата рамка от данни. ValueError: Индексът съдържа дублиращи се записи, не може да се преоформи... Тази грешка се появява конкретно по време на третата и последна стъпка, която изброихте по-горе. - person RyanG73; 16.12.2018
comment
@RyanG73 тази грешка показва, че датите не са уникални. Вашите данни съдържат ли няколко отбора, които играят на една и съща дата? - person It_is_Chris; 16.12.2018
comment
да, така е. Включва пълен сезон от игри, когато има нощ, в която има няколко игри - person RyanG73; 16.12.2018
comment
@RyanG73 виж upadte - person It_is_Chris; 16.12.2018